Linux的so文件到底是干嘛的?浅析Linux的动态链接库 - 知乎微信公众号:ilulaoshi,原文发表在我的个人网站:Linux的so文件到底是干嘛的?浅析Linux的动态链接库 上一篇我们分析了Hello World是如何编译的,即使一个非常简单的程序,也需要依赖C标准库和系统库,链接其实就…https://zhuanlan.zhihu.com/p/235551437(windows平台下)深入详解C++创建动态链接库DLL以及如何使用它(一) - 知乎前言:C以及C++的动态链接库和静态链接库,说起来很简单,但是实际上在创建的过程中有很多的坑,本人也是一路踩了很多坑,查了很多资料,下决定写一篇完整的文章来详细解释使用VS创建C++动态链接库的完整流程。本…https://zhuanlan.zhihu.com/p/103082370linux 动态链接库so的封装及调用_YHR14的博客-CSDN博客_linux 封装动态链接库       首先定义hello.c文件#include <stdio.h>void hello(const char * name){ printf("Hello , %s!\n", name);}       定义hello.h头文件#ifndef HELLO_H#define HELLO_Hint g_count = 100;vo...https://blog.csdn.net/YHR14/article/details/81742519        如何使用vs将C++项目打包成一个dll_qq_41614283的博客-CSDN博客_c++ 打包dllcolor=#0099ff size=50 face=“黑体”https://blog.csdn.net/qq_41614283/article/details/106089843

linux 动态链接库so的封装及调用_YHR14的博客-CSDN博客_linux 封装so库       首先定义hello.c文件#include &lt;stdio.h&gt;void hello(const char * name){ printf("Hello , %s!\n", name);}       定义hello.h头文件#ifndef HELLO_H#define HELLO_Hint g_count = 100;vo...https://blog.csdn.net/YHR14/article/details/81742519Linux C++简单生成与调用so库_jaykk的博客-CSDN博客_linux下c++调用so文件Linux C++简单生成与调用so库生成so库调用so库初探解决参考资料网上有很多C语言编译so库的方法,用C++的偏少,遇见了一些坑,这里记录一下,以作参照。生成so库先实现一个最简单的函数,libtest.cpp(先不考虑extern "C"这句话):#include<iostream>//extern "C"double ddd(double a){return...https://blog.csdn.net/m0_37980456/article/details/103644846CMAKE使用链接第三方SO库 - 简书CMake 命名变量 set(INC_DIR /usr/local/include) set(LINK_DIR /usr/local/lib) set(SOURCE_FILE...https://www.jianshu.com/p/354c64b0e26bcpp代码在linux平台封成动态库so文件,也可以封装成.a静态文件,在win平台都是封成dll,so和dll都是可以被python和cpp调用的。其实封成dll对我来说意义不大,但是so的生成意义还是很多的,封成so简单的就是gcc命令行,复杂的就通过cmake来转。cpp调用这块稍微看一下,转不是重点,尤其是在dll上转,后面python调用so是重点,值得关注。

1.DLL

        dll是win下的动态链接库,linux中的so有.so和与之对应的头文件,win下的动态库有两个文件,一个是引入库.lib文件,一个是动态库.dll文件. 要用extern "C" _declspec(dllexport) 来导出dll。

2.cpp调用so

        之前是把cpp代码在linux平台转成so或者是可执行文件,用cmake也是可以转可执行文件的,转可执行文件一般是 g++ -o xxx xxx.cpp,然后./xxx,即可执行。cpp代码在linux上一定要先编译,不编译无法执行的。一种是直接写在程序中调用的,void *handle = dlopen("./libtest.so",RTLD_LAZY);一种是写在头文件上直接#inlucde进来使用的,但是编译成动态库基本都是g++ -fPIC -shared libxxx.cpp -0 libxxx.so,这样一般就是编译产生了so文件,后面可以直接调用,或者编译,对于main.cpp,前者是g++ -o a.out main.cpp -ldl,后面一定要加ldl,不然编译不成功,后者的话,复杂一点,(注意cpp用g++编译,c用gcc编译)。

3.cmake如何编译调用so文件

        放在cmake中一起编译是最常见的做法了,图像上最常见的opencv,imagemagick之类的很多都提前做成so,放在项目中直接调用,当然imagemagick和opencv也需要一些底层的库支持,这些库是需要提前安装好的,放在项目中转成so提前编译好的做法是比较好的隔离开平台之间的相互影响。

命名变量
set(OPENCV_ROOT_DIR ${THIRDPARTY_DIR}/opencv)

去哪里找头文件(.h)
include_directories(${OPENCV_ROOT_DIR}/linux_x86_64)

去哪里找库文件(.cpp)
link_directories(${OPENCV_ROOT_DIR}/linux_x86_64)

要链接的库文件的名字,
target_link_libraries(test libopencv.so)

Logo

更多推荐