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

    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 <dlfcn.h>
    #include <stdlib.h>
    #include <iostream>
    using namespace std;
    int main()
    {
        int a = 0;
        
        void *handle = dlopen("./libadd_c.so", RTLD_LAZY);
        
        if(!handle)
        {
            printf("open lib error\n");
            cout<<dlerror()<<endl;
            return -1;
        }
        
        typedef int (*add_t)(int a, int b);
        add_t add = (add_t) dlsym(handle, "add");
        if(!add)
        {
            cout<<dlerror()<<endl;
            dlclose(handle);
            return -1;
        }
        
        
        a = add(3, 4);
        printf("a = %d\n",a);
        dlclose(handle);
        return 0;
    }

     

    编译:

    g++ test.cpp -ldl -o test

     3.运行

    ./test

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

    展开全文
  • 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
    展开全文
  • 文章目录动态链接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生成so库及调用

    2017-07-12 11:35:29
    tof.h #include "stdio.h" void tof(); tof.cpp #include "tof.h" #include using namespace std; void tof() ...生成so 库  gcc tof.cpp -fPIC -shared -o libtof.so -fPIC
  • data.gettime() data.write_data() if __name__ == '__main__': main() 运行得到结果 到此这篇关于python打包生成so文件的实现的文章就介绍到这了,更多相关python打包生成so文件内容请搜索我们以前的文章或继续浏览...
  •  最近在项目开发过程中需要生成.so文件来给其他的程序调用,而我的这部分程序又需要调用其他的.so,这对于一个刚刚入职的程序猿来说着实有些令人着急,大致的项目需要如图,其中libStd.so是项目的标准库,和我的.so...
  • gcc -O -fPIC -shared -o libtest.so test.h test.c 2、将文件添加到项目路径: 将libtest.so文件和test.h文件复制到.pro文件同级目录 3、在.pro文件中添加代码: LIBS += ./libtest.so 注意!! 交叉编译的话,...
  • Linux生成和使用so

    千次阅读 2015-10-26 10:00:34
    最近,项目要求将处理用户的操作的函数做成so文件,然后找了一下相关...关于问题二:比如我们生成了一个动态链接库test.so。此时该文件在我们的工作目录下,和我们调用的程序在一起,这个时候执行程序会提示 error w
  • 静态库在linux环境中, 使用ar命令创建静态库文件.如下是命令的选项:d -----从指定的静态库文件中删除文件m -----把文件移动到指定的静态库文件中p -----把静态库文件中指定的文件输出到标准输出q -----快速地把文件...
  • linux下gfortran 生成so文件

    千次阅读 2019-08-14 13:49:30
    Fortran 90增加了Module的功能,可用来替代common data,打包子程序。因此,一个方便使用的Fortran程序包应该尽量采用module的形式。那么如何使用已经写好的module呢,一个比较...本文介绍在Linux环境下如何使用gf...
  • Linux上FFmpeg生成so

    千次阅读 2017-12-25 12:18:35
    我用的是ubuntu做开发的,之前使用过centos7去编译的 感觉太麻烦出错了,从朋友那得知ubuntu和debian 是适用于开发的 ...3.把linux版的ndk上传到ubuntu服务器上 4.cd /home/ 切换到home 目录 5.mk
  • linux生成.so库,写C++接口

    千次阅读 2018-10-16 10:50:12
    1.写要生成库的头文件和实现文件 IPCz.cpp只需要包含一下头文件即可。 #include"IPCz.h" IPCz.h中需要包含所有的头文件。 #define IPCZ_H #include <stdio.h> #include <cstdlib> #include <...
  • 1. 简介在python、java等...而本文主要介绍的是跨平台编译:针对windows系统中的C++程序在linux编译成动态链接库的过程。2. .so及.dll介绍2.1 .dllWindows下动态链接库以 .DLL事实上和 EXE 文件一样,同属 PE 格式...
  • linux .so 生成与调用

    2015-01-28 21:21:00
    方法一: 有test.h,test1.c,test2.c,main.c,其中: 1 // main.c 2 #include "test.h" 3 4 void main(){ 5 test1(); 6 test2();...生成.so: gcc test1.c test2.c -fPIC -shared -o libtest.so
  • $gcc -c hello.c -o hello.o1....连接成动态库生成动态库用gcc来完成,由于可能存在多个版本,因此通常指定版本号:$gcc -shared -Wl,-soname,libhello.so.1 -o libhello.so.1.0 hello.o另外再建立...
  • Linux生成.so文件

    千次阅读 2016-07-28 09:47:00
    linux下的.so文件即Shared Libraries。Shared Library 是程序运行时加载的库文件。当一个shared library 被成功的安装以后,之后启动的所有程序都会自动使用最新的shared library。也就是说,生成一个.so文件并告诉...
  • 动态库共享库 第一步:通过gcc -fPIC -c 编译生成.o文件 gcc -fPIC -c a.c (编译生成.o文件 -fPIC与...第二步:通过上面已经生成的a.o,b.o文件生成.so文件 方法1: gcc -shared -Wl -o liba.so a.o 方法2: gcc -share
  • $gcc -c hello.c -o hello.o1....连接成动态库生成动态库用gcc来完成,由于可能存在多个版本,因此通常指定版本号:$gcc -shared -Wl,-soname,libhello.so.1 -o libhello.so.1.0 hello.o另外再建立...
  • 本文主要通过导出一个log文件操作的类,来说明linuxso库的生成与调用。先说明一下本文中的几个文件和其作用: 1)ilogfile.h主要用于定义Clogfile类的借口和声明一个C风格的create导出函数,该文件为导出文件,在用...

空空如也

空空如也

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

linux生成so

linux 订阅