精华内容
下载资源
问答
  • 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包含的三个函数,还有其它信息有兴趣自行看资料。

    展开全文
  • 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

    tof.h

    #include   "stdio.h"

    void tof();


    tof.cpp

    #include "tof.h"

    #include <iostream> 

    using namespace std;

    void tof()

    {

    cout<<"OK5"<<endl;

    }


    生成so 库 

    gcc tof.cpp -fPIC -shared -o libtof.so
    -fPIC  编译cpp文件需要

    libtof.so 格式必须是libxx.so

    testtof.cpp

    #include <stdio.h>
    int main()
    {
       
     tof();

    }

    链接指定文件夹下的so库文件 生成可执行文件
    g++ testtof.cpp -L. -ltof -o testtof -Wl,-rpath,/home/zxh/Documents/testtof
    展开全文
  •  最近在项目开发过程中需要生成.so文件来给其他的程序调用,而我的这部分程序又需要调用其他的.so,这对于一个刚刚入职的程序猿来说着实有些令人着急,大致的项目需要如图,其中libStd.so是项目的标准,和我的.so...

    开发环境:

      CentoOs(Linux )

     

    起因:

      最近在项目开发过程中需要生成.so文件来给其他的程序调用,而我的这部分程序又需要调用其他的.so,这对于一个刚刚入职的程序猿来说着实有些令人着急,大致的项目需要如图,其中libStd.so是项目的标准库,和我的.so在同一父目录下,libmkl_xxx.so是mkl库,在系统目录下。

    当时由于是第一次生成.so(年少无知),照着网上的代码直接就编译了,然后其他同事在使用时出现undefined symbol <something>.

    错误代码:

      

    g++ -c -g -fPIC Dir1/*.cpp Dir2/*.cpp -I/opt/intel/mkl/include
    
    g++ -shared -o libMyLib.so *.o

     概念:

      函数库可以分成动态库(dynamic)和静态库(static),静态库相当于把你的所有文件都打了包,以后要跟其他程序集成的话就得把整个包给集成进去,这往往导致最终程序会变得很大,而且也不易升级、维护,动态库相当于一个开放的包,大家都可以用,只要你链接到它,你也可以用,我链接到之后我也可以用,是公共、独立的。两者更进一步的区别参考链接【1】在不同系统上这两者命名稍微有些不同:

    (后缀) Windows Linux
    静态库 .lib .a
    动态库 .dll .so

     

      .so文件是shared object文件,即共享对象,也就是说其在加载后是可以被多个进程所共享,至于如何实现可以参考链接【2】。

      -fPIC: Position Independent Code,参见链接【2】

      -shared:表示产生的是共享对象

      由于在链接产生共享对象的时候需要检查语法和语义,所以在链接阶段需要指定链接的库名-l和库所在位置-L【1】(这也是我出现上面的错误的原因)

    解决方案:

      

    g++ -c -g -fPIC Dir1/*.cpp Dir2/*.cpp -I/opt/intel/mkl/include
    
    g++ -shared -o libMyLib.so *.o -lStd -L../PATH_A/TO/Bin -lmkl_xxx -L/PATH_B/TO_MKL_XXX

     后续:

      为了查看自己生成的库链接对不对,可以使用

    ldd MyLib

      这条指令用于查看依赖项,即你的库有没有链接成功

      可以看到上面的libBarbeque.so没有找到,这是为什么的?我明明在链接阶段指定了对应的.so才对?先别急,这是因为你虽然刚刚指定库,但是系统在查找时默认只会在当前路径或者系统指定的LD_LIBRARY_PATH目录下查找,所以你只需要把依赖的.so放到当前目录下,或者用配置环境变量的方式使系统知道你需要在哪里找,可以参考链接【3】(记得是修改LD_LIBRARY_PATH不是默认的PATH!)

      最后注意,在实际运行的时候也需要指定对应的库和路径,在LD_LIBRARY_PATH中添加.so所在文件夹,这样可以确保程序顺利调用

    【1】http://blog.csdn.net/nieyinyin/article/details/6890557:linux中的.so和.a文件

    【2】http://www.cnblogs.com/cswuyg/p/3830703.html:linux共享对象之编译参数fPIC

        简要提纲(仅供自己观看,有理解不对的请谅解!)

         1.如果不采用PIC,相当于给每个进程开专线,这样物理内存利用率不高;PIC在我认为就是建立了一个中转站,大家先来中转站,再转到对应的模块;

    【3】http://www.cnblogs.com/hust-chenming/p/4943268.html:linux查看和修改PATH环境变量的方法

    转载于:https://www.cnblogs.com/yemanxiaozu/p/7524600.html

    展开全文
  • 动态共享 第一步:通过gcc -fPIC -c 编译生成.o文件 gcc -fPIC -c a.c (编译生成.o文件 -fPIC与位置无关) gcc -fPIC -c b.c 生成a.o,b.o编译文件。 第二步:通过上面已经生成的a.o,b.o文件生成.so文件 方法1: ...
  • Linux上FFmpeg生成so库

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

    千次阅读 2018-03-20 14:44:06
    一、编译链接库(a库和so库)方法一般linux环境下的链接库分为a库和so库,分别表示静态链接库和动态链接库,其作用是把C程序编译好做成一种可执行链接文件,c主程序文件调用这些程序的函数接口是可以使用a库或so库,...
  • 1、将现有的文件编译为动态: gcc -O -fPIC -shared -o libtest.so test.h test.c 2、将文件添加到项目路径: 将libtest.so文件和test.h文件复制到.pro文件同级目录 3、在.pro文件中添加代码: LIBS += ./...
  • 静态linux环境中, 使用ar命令创建静态文件.如下是命令的选项:d -----从指定的静态文件中删除文件m -----把文件移动到指定的静态文件中p -----把静态文件中指定的文件输出到标准输出q -----快速地把文件...
  • Linux 下cmake生成SO库的使用实例

    千次阅读 2019-01-08 11:03:02
    1、创建我的共享:MySharedLib CMakeLists.txt cmake_minimum_required(VERSION 2.8) project(MySharedLib) # C++11 编译 set(CMAKE_CXX_STANDARD 11) #创建共享 add_library(MySharedLib SHARED library.cpp ...
  • Linux生成和使用so库

    千次阅读 2015-10-26 10:00:34
    最近,项目要求将处理用户的操作的函数做成so文件,然后找了一下相关...关于问题二:比如我们生成了一个动态链接test.so。此时该文件在我们的工作目录下,和我们调用的程序在一起,这个时候执行程序会提示 error w
  • 本文主要通过导出一个log文件操作的类,来说明linuxso库生成与调用。先说明一下本文中的几个文件和其作用: 1)ilogfile.h主要用于定义Clogfile类的借口和声明一个C风格的create导出函数,该文件为导出文件,在用...
  • 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 <...
  • $gcc -c hello.c -o hello.o1....连接成动态库生成动态用gcc来完成,由于可能存在多个版本,因此通常指定版本号:$gcc -shared -Wl,-soname,libhello.so.1 -o libhello.so.1.0 hello.o另外再建立...

空空如也

空空如也

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

linux生成so库

linux 订阅