zoukankan      html  css  js  c++  java
  • Linux下C++调用C动态库使用

    动态库编译

    ShareLib1.h

    #ifndef __SHARELIB1_H__
    #define __SHARELIB1_H__
    
    #ifdef __cplusplus
    extern "C" {
    #endif
    
    void ShareLib1_Print();
    
    #ifdef __cplusplus
    }
    #endif
    
    #endif
    

    ShareLib1.c

    #include "ShareLib1.h"
    #include<stdio.h>
    
    void ShareLib1_Print()
    {
        printf("Share Lib Print 1
    ");
    }
    

    编译动态库命令

    code@code-VBox:~/code/unix/sharelib$ gcc ShareLib1.c -fPIC -shared -o libShareLib1.so
    code@code-VBox:~/code/unix/sharelib$ ls
    libShareLib1.so  ShareLib1.c  ShareLib1.h
    

    动态库使用

    C++调用C的动态库

    main.cpp

    #include"ShareLib1.h"
    
    int main(void)
    {
        ShareLib1_Print();
        return 0;
    }
    

    编译main.cpp

    code@code-VBox:~/code/unix/sharelib$ g++ main.cpp -L. -lShareLib1
    code@code-VBox:~/code/unix/sharelib$ ls
    a.out  libShareLib1.so  main.cpp  ShareLib1.c  ShareLib1.h
    

    此时直接执行./a.out会报错如下

    code@code-VBox:~/code/unix/sharelib$ ./a.out 
    ./a.out: error while loading shared libraries: libShareLib1.so: cannot open shared object file: No such file or directory
    

    三种方法解决

    1. 将libShareLib1.so所在路径添加到LD_LIBRARY_PATH,然后再执行./a.out,该方法当当前窗口关闭后失效。

      code@code-VBox:~/code/unix/sharelib$ export LD_LIBRARY_PATH=/home/code/code/unix/sharelib:$LD_LIBRARY_PATH
      code@code-VBox:~/code/unix/sharelib$ ./a.out 
      Share Lib Print 1
      
    2. 将libShareLib1.so放到/usr/lib目录下

      code@code-VBox:~/code/unix/sharelib$ sudo cp libShareLib1.so /usr/lib/
      [sudo] password for code:
      code@code-VBox:~/code/unix/sharelib$ ./a.out 
      Share Lib Print 1
      
    3. 将libShareLib1.so写到配置文件中

      ShareLib1.conf

      /home/code/code/unix/sharelib
      

    将ShareLib1.conf放到lib config目录下,然后重新加载lib config。

    code@code-VBox:~/code/unix/sharelib$ sudo mv ShareLib1.conf /etc/ld.so.conf.d
    code@code-VBox:~/code/unix/sharelib$ sudo /sbin/ldconfig
    code@code-VBox:~/code/unix/sharelib$ ./a.out 
    Share Lib Print 1
    
  • 相关阅读:
    C# 使用 sid 连接 Oracle(无需安装 Oracle 客户端)
    命令模式(Command Pattern)
    仅仅使用Google就完成了人生第一次破解
    GeoServer跨域问题
    List与DataTable相互转换
    GeoServer2.14.1修改端口
    坐标转换C#(Gcj02、wgs84、bd09互转)
    nginx启动报错(1113: No mapping for the Unicode character exists in the target multi-byte code page)
    C# 操作 Mongodb
    DocumentFormat.OpenXml导出word合并(文件被另一个进程占用)
  • 原文地址:https://www.cnblogs.com/spring-1991/p/10835684.html
Copyright © 2011-2022 走看看