精华内容
下载资源
问答
  • 1、 纯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

    1eca6c6790207726c751d839c2c508a5.png
    展开全文
  • 为了不暴露源码,将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包含的三个函数,还有其它信息有兴趣自行看资料。

    展开全文
  • 文章目录动态链接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)	
    
    展开全文
  • $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:30
    Fortran 90增加了Module的功能,可用来替代common data,打包子程序。因此,一个方便使用的Fortran程序包应该尽量采用module的形式。那么如何使用已经写好的module呢,一个比较...本文介绍在Linux环境下如何使用gf...
  • data.gettime() data.write_data() if __name__ == '__main__': main() 运行得到结果 到此这篇关于python打包生成so文件的实现的文章就介绍到这了,更多相关python打包生成so文件内容请搜索我们以前的文章或继续浏览...
  • Linux生成.so文件

    千次阅读 2016-07-28 09:47:00
    linux下的.so文件即Shared Libraries。Shared Library 是程序运行时加载的库文件。当一个shared library 被成功的安装以后,之后启动的所有程序都会自动使用最新的shared library。也就是说,生成一个.so文件并告诉...
  • Linuxso文件生成和使用

    千次阅读 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=
  • $gcc -c hello.c -o hello.o1....连接成动态库生成动态库用gcc来完成,由于可能存在多个版本,因此通常指定版本号:$gcc -shared -Wl,-soname,libhello.so.1 -o libhello.so.1.0 hello.o另外再建立...
  • #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 ...
  • 一、动态库文件生成源文件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环境中, 使用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:12
    1.制作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根目录下 锁定到sample文件下 所需要的头文件也必须包含在文件内rm -f *.o 清除之前生成的.o文件./compliel /...................................../需要生成的C++文件目录/*.c* 2&gt;complieIfo.log //...
  • QT在Ubuntu系统的开发,由于Linux系统不支持dll文件,而是支持so文件,因此,需要生成so文件从而能够被qt在Linux系统的调用,还望各位博友多多支持
  • $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 目录下...
  • 我们在安装环境的时候安装了NDK,可以在eclipse下直接生成so文件。NDK的压缩包里面自带了一些sample工程,NDK的文件直接解压到某个目录下即可。 第一次生成so文件的时候,我们先使用NDK的sample下的hello-jni的...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 1,918
精华内容 767
关键字:

linux生成so文件

linux 订阅