-
linux 生成so文件有多个_Linux环境下C++文件的各种形式组合动态库.so
2020-11-27 20:38:411、 纯cpp文件打包动态库将所有cpp文件和所需要的头文件放在同一文件夹,然后执行下面命令gcc -shared -fpic *.c -o xxx.so;g++ -std=c++17 -shared -fpic *.cpp -o xxx.so;[C++17标准,需要高版本gcc,本人采用...1、 纯cpp文件打包动态库
将所有cpp文件和所需要的头文件放在同一文件夹,然后执行下面命令
gcc -shared -fpic *.c -o xxx.so;
g++ -std=c++17 -shared -fpic *.cpp -o xxx.so;
[C++17标准,需要高版本gcc,本人采用gcc 8.2.0]
其中*.c代表所有的c文件,xxx.so中的xxx代表so动态库的名字, -std=c++17代表采用C++17标准编译。
2、 多个cpp文件和so库一起打包成一个so
如果存在一个动态库libRandom.so,现在需要将AFClassifier.cpp和该so一起打包成test.so,则可以用以下命令:
g++ -std=c++17 -fpic AFClassifier.cpp -shared -L. -lRandom -o test.so
3、 多个so打包为一个so
如果有两个so,分别为 libRandom.so和libAF.so,并且在当前目录下面,则执行下面命令:
g++ -std=c++17 -fpic -shared -L. -lAF -lRandom -o test.so
如果libRandom.so和libAF.so不在当前目录,-L 后面要加上目录,比如在当前目录的下一层目录,则:
g++ -std=c++17 -fpic -shared -L ./ -lAF -lRandom -o test.so
-
Linux 生成so库文件并调用
2019-11-05 17:45:46为了不暴露源码,将c文件生成so动态库来给别人调用 记录一下方法 首先简单的创建一些测试文件:test.h a.c b.c c.c 如下: test.h #include <stdio.h> void a(); void b(); void c(); a.c #include "test.h...为了不暴露源码,将c文件生成so动态库来给别人调用
记录一下方法
首先简单的创建一些测试文件:test.h a.c b.c c.c
如下:
test.h#include <stdio.h> void a(); void b(); void c();
a.c
#include "test.h" void a() { printf("aaa\n"); }
b.c
#include "test.h" void b() { printf("bbb\n"); }
c.c
#include "test.h" void c() { printf("ccc\n"); }
执行下面命令生成so文件:
gcc a.c b.c c.c -fPIC -shared -o libtest.so
下面写一个测试程序test.c,调用该so文件是否正常:
test.c#include "test.h" int main() { a(); b(); c(); return 0; }
执行下面命令生成test可执行文件:
gcc test.c -L. -ltest -o test
下面执行看下结果:
可以看到能调用函数,证明so文件没问题。
对上面一些参数解释:
-shared该选项指定生成动态连接库(让连接器生成T类型的导出符号表,有时候也生成弱连接W类型的导出符号),不用该标志外部程序无法连接。相当于一个可执行文件-fPIC:表示编译为位置独立的代码,不用此选项的话编译后的代码是位置相关的所以动态载入时是通过代码拷贝的方式来满足不同进程的需要,而不能达到真正代码段共享的目的。
-Lxxx:xxx表示指定库所在的位置,因为我是当前目录,所以是-L.
-ltest:编译器查找动态连接库时有隐含的命名规则,即在给出的名字前面加上lib,后面加上.so来确定库的名称( l 的意思是lib,ltest即是去找libtest这个so)
下面介绍一下两个so相关命令
ldd
nm命令
可以看出so包含的三个函数,还有其它信息有兴趣自行看资料。 -
2019-11-14 linux生成调用.so文件
2019-12-21 10:15:03文章目录动态链接linux生成.so文件linux使用.so文件静态链接linux生成.a文件linux使用.so文件 动态链接 简单理解就是记录文件的路径,通过路径找到对应文件,文件删除,库则无法使用 优点:不占空间 缺点:效率低 ...动态链接
简单理解就是可执行文件记录库的路径,通过路径找到对应库文件,库文件删除,执行文件不可执行
优点:不占空间缺点:效率低
linux生成.so文件
gcc -fPIC -shared test.c -o libtest.so -fPIC 是压制警告 -shared 是生成动态库 test.c 是要编译成库的文件 -o后面 是要生成的文件的名称(lib+name)
linux使用.so文件
gcc -g -o main main.c -ltest -L. -L. -L后加动态库路径(.代表本地目录)、 -l 后面加库名称(name)
执行文件前会报错“cannot open shared object file: No such file or directory”,执行下面命令把.so库文件的路径写入LD_LIBRARY_PATH
export LD_LIBRARY_PATH=库文件绝对路径:$LD_LIBRARY_PATH
静态链接
可以理解成可执行文件中包含了库代码的一份完整拷贝,之后库文件删除了也能使用
优点:效率高
缺点:占空间
linux生成.a文件
1.编译成.o文件 gcc -c -o test.o test.c 2.ar工具把.o文件打包成.a ar -r -s -o libtest.a test.o -s:ranlib
linux使用.so文件
gcc -c -o test.o test.c -ltest -L. -L. -L后加静态库路径(.代表本地目录)、 -l 后面加库名称(name)
-
linux将所有文件生成lst_linux环境生成.so文件
2020-12-20 23:32:39$gcc -c hello.c -o hello.o1....连接成动态库生成动态库用gcc来完成,由于可能存在多个版本,因此通常指定版本号:$gcc -shared -Wl,-soname,libhello.so.1 -o libhello.so.1.0 hello.o另外再建立...$gcc -c hello.c -o hello.o
1.连接成静态库
连接成静态库使用ar命令,其实ar是archive的意思
$ar cqs libhello.a hello.o
2.连接成动态库
生成动态库用gcc来完成,由于可能存在多个版本,因此通常指定版本号:
$gcc -shared -Wl,-soname,libhello.so.1 -o libhello.so.1.0 hello.o
另外再建立两个符号连接:
$ln -s libhello.so.1.0 libhello.so.1
$ln -s libhello.so.1 libhello.so
这样一个libhello的动态连接库就生成了。最重要的是传gcc -shared 参数使其生成是动态库而不是普通执行程序.
-Wl 表示后面的参数也就是-soname,libhello.so.1直接传给连接器ld进行处理。实际上,每一个库都有一个soname,当连接器发现它正 在查找的程序库中有这样一个名称,连接器便会将soname嵌入连结中的二进制文件内,而不是它正在运行的实际文件名,在程序执行期间,程序会查找拥有 soname名字的文件,而不是库的文件名,换句话说,soname是库的区分标志。
这样做的目的主要是允许系统中多个版本的库文件共存,习惯上在命名库文件的时候通常与soname相同
libxxxx.so.major.minor
其中,xxxx是库的名字,major是主版本号,minor 是次版本号
至于头文件的使用 只要.c文件和.h文件在同一目录下就可以直接用#include "your.h" 如果在.c文件的上层目录 那只要做如下修改#include "../your.h" 就能够让你的编译器找到了!
一、创建共享库
1 单独编译SList.cpp,编译时需要传入-fPIC选项,告诉编译器生成位置无关代码.
位置无关代码可以被加载到地址空间的任意位置而不需要修改.
[root@LEE src]# ls
main.cpp SList.cpp SList.h
[root@LEE src]# g++ -fPIC -g -c SList.cpp
2 当链接到库时,为链接器传入-shared选项,把目标文件SList.o链接为共享对象
libSList.so.1.0.1
每个共享库都有一个特定的搜索名(soname).搜索名约定如下:
lib+库名+.so+.版本号
在文件系统中,搜索名是一个指向实名的符号连接.每个共享库也有一个特定的实名,约定如下:
搜索名+.子版本号+.发布号
你可以使用一个特殊的编译器选项-Wl,option,将option传给ld,用逗号分隔多个option,
为了在所有的系统上得到最好结果,链接libSList到标准C++库上
[root@LEE src]# g++ -g -shared -Wl,-soname,libSList.so.1 -o libSList.so.1.0.1 SList.o -lstdc++
[root@LEE src]# ls
libSList.so.1.0.1 main.cpp SList.cpp SList.h SList.o
libSList.so.1是搜索名,libSList.so.1.0.1是实名,SList.o是目标文件(也可以是多个目标文件的列表)
,-lstdc++是库需要访问的库(也可以是库的列表-llibrary,关于此选项参考附录.)
3 创建一个从soname链接到库
[root@LEE src]# ln -fs libSList.so.1.0.1 libSList.so.1
[root@LEE src]# ln -fs libSList.so.1 libSList.so
4 使用-L使链接器在当前目录中查找库,并且使用-lSList告诉它要链接哪个库
[root@LEE src]# g++ -g -c main.cpp -o main.o
[root@LEE src]# g++ -g -o main main.o -L. -lSList
[root@LEE src]# ls
libSList.so libSList.so.1.0.1 main.cpp SList.cpp SList.o
libSList.so.1 main main.o SList.h
5 运行命令
[root@LEE src]# LD_LIBRARY_PATH=$(pwd) ./main [In the same line]
4->17->19->10->23->21->11->20
LD_LIBRARY_PATH
提供用来搜索库的目录路径,以冒号作为间隔.正常情况下它不应该被设置,因为系统文件
/ect/ld.so.conf提供了默认的路径.
二、使用链接库
当运行一个程序时,动态装载器通常在/ect/ld.so.conf.d目录查找程序所需要的库.但是,如果
LD_LIBRARY_PATH 环境变量被设置,它首先扫描在LD_LIBRARY_PATH 中列出的目录.对于上一节5,如果直接运行
命令 ./main,会出现找不到库的现象.如:
[root@LEE src]# ./main
./main: error while loading shared libraries: libSList.so.1: cannot open shared object file: No such file or directory
上述问题的解决方案有两种(我能想到的):
1 如果LD_LIBRARY_PATH 没设定:
拷贝libSList.so到目录 /usr/local/lib (同理也可以拷到/usr/lib下)
[root@LEE src]# cp libSList.so /usr/local/lib
[root@LEE src]# ldconfig /usr/local/lib
[root@LEE src]# ./main
4->17->19->10->23->21->11->20
2 如果LD_LIBRARY_PATH 设定:
编辑.bash_profile文件
添加LD_LIBRARY_PATH:=$LD_LIBRARY_PATH:/path/to/libSList.so(不包括 libSList.so)
执行.bash_profile 文件.
[root@LEE src]# . /root/.bash_profile
[root@LEE src]# ./main
4->17->19->10->23->21->11->20
-
linux下gfortran 生成so文件
2019-08-14 13:49:30Fortran 90增加了Module的功能,可用来替代common data,打包子程序。因此,一个方便使用的Fortran程序包应该尽量采用module的形式。那么如何使用已经写好的module呢,一个比较...本文介绍在Linux环境下如何使用gf... -
linux系统python生成so_python打包生成so文件的实现
2020-12-13 12:39:11data.gettime() data.write_data() if __name__ == '__main__': main() 运行得到结果 到此这篇关于python打包生成so文件的实现的文章就介绍到这了,更多相关python打包生成so文件内容请搜索我们以前的文章或继续浏览... -
Linux下生成.so文件
2016-07-28 09:47:00linux下的.so文件即Shared Libraries。Shared Library 是程序运行时加载的库文件。当一个shared library 被成功的安装以后,之后启动的所有程序都会自动使用最新的shared library。也就是说,生成一个.so文件并告诉... -
Linux下so文件的生成和使用
2015-09-21 12:48:11环境:Vmware Workstation;CentOS-6.4-x86_64 说明: 源文件中不能有main函数;写so文件的时候使用C语言写,不要用C++。 程序: ...1、创建生成so文件的makefile: .SUFFIXES:.c .o CC=gcc SRCS= -
linux将所有文件生成lst_Linux如何生成.so库文件
2020-12-30 11:40:36$gcc -c hello.c -o hello.o1....连接成动态库生成动态库用gcc来完成,由于可能存在多个版本,因此通常指定版本号:$gcc -shared -Wl,-soname,libhello.so.1 -o libhello.so.1.0 hello.o另外再建立... -
linux GCC 生成so文件 makefile 编写 Windows代码移植
2020-12-14 17:08:50#elif defined(_WIN32) || defined(WIN32) || defined(WIN32) #ifdef _WIN32 #include #include #else #include #include #include #include #endif 实例 OUTPUTFILE=libPcie55.so all: Pcie55 Pcie55:pkg.o sm4.o ... -
python importlib 生成so文件 报错_『Python CoolBook』ctype读取Linux动态库so文件
2021-02-09 03:18:40一、动态库文件生成源文件hello.c#include "hello.h"#include void hello(const char *name){printf("Hello %s!\n", name);}int factorial(int n){if (n < 2)return 1;return factorial(n - 1) * n;}/* Compute ... -
linux系统python生成so_Linux下生成静态库.a文件和动态库.so文件
2020-12-10 00:34:40静态库在linux环境中, 使用ar命令创建静态库文件.如下是命令的选项:d -----从指定的静态库文件中删除文件m -----把文件移动到指定的静态库文件中p -----把静态库文件中指定的文件输出到标准输出q -----快速地把文件... -
linux下生成.so文件和.a文件
2019-01-23 10:48:37原文链接:... linux下生成.so文件和.a文件 test.h 1 #ifndef _TEST_H_ 2 #define _TEST_H_ 3 4 void TestA(); 5 void TestB(); 6 7 #endif t... -
C++Linux生成SO库
2021-03-03 17:40:121.制作so文件:libadd_c.so add.c: int add(int a, int b) { return a + b; } 编译: gcc -shared -fpic -lm -ldl -o libadd_c.so add.c 2.编写测试函数 test.cpp #include <stdio.h> #include <... -
TC c++文件在linux环境下如何生成SO文件
2018-05-25 20:03:18在TC根目录下 锁定到sample文件下 所需要的头文件也必须包含在文件内rm -f *.o 清除之前生成的.o文件./compliel /...................................../需要生成的C++文件目录/*.c* 2>complieIfo.log //... -
qt生成so文件,再调用so文件-1.pdf
2020-08-21 17:32:07QT在Ubuntu系统的开发,由于Linux系统不支持dll文件,而是支持so文件,因此,需要生成so文件从而能够被qt在Linux系统的调用,还望各位博友多多支持 -
linux将所有文件生成lst_Linux如何生成.so库文件(转)
2020-12-20 23:32:43$gcc -c hello.c -o hello.o1....连接成动态库生成动态库用gcc来完成,由于可能存在多个版本,因此通常指定版本号:$gcc -shared -Wl,-soname,libhello.so.1 -o libhello.so.1.0 hello.o另外再建立... -
linux 环境下通过NDK 生成so文件
2018-06-12 07:57:24解压下载的文件 tar -zxvf android-ndk-r10b.tar.gz 将eclipse 中的jni 文件夹复制到 解压出来的android-ndk-r10b 目录下 执行 ./ndk-build 命令执行完就会在android-ndk-r10b 目录下... -
linux下利用NDK(Eclipse)生成so文件
2014-06-23 10:35:18我们在安装环境的时候安装了NDK,可以在eclipse下直接生成so文件。NDK的压缩包里面自带了一些sample工程,NDK的文件直接解压到某个目录下即可。 第一次生成so文件的时候,我们先使用NDK的sample下的hello-jni的...