LINUX下C++生成.so文件及编译生成可执行文件的过程

时间:2024-05-19 21:28:17

以下是.so库的生成及编译步骤:
如果.cpp文件不多的话,可以将.cpp和.hpp文件都放在一个目录下,依次输入名称进行编译.也可以用指令将整个目录下的.cpp文件全部编译.这里先记录下依次输入名称的方法.
1.对目录下不包含main函数的.cpp文件进行统一编译(必须将使用到的.hpp文件都放进来)
LINUX下C++生成.so文件及编译生成可执行文件的过程终端进入目录,输入以下命令

g++ ibeo_socket.cpp base64.cpp lidar_ready.cpp robo16_socket.cpp tinyxml2.cpp vlp16_socket.cpp -fPIC -shared -o liblidar.so

将所有不包含main函数的.cpp文件名称都输入至终端,然后加上-fPIC -shared -o 表示生成共享库,最后加上 libXXX.so,此处XXX可根据需要随意命名,我的代码是雷达相关的,所以命名为liblidar.so.
XXX前的"lib"应该是标准命名方式所需要的,方便后续生成可执行文件的时候引用.so库.编译后有如下的报错
LINUX下C++生成.so文件及编译生成可执行文件的过程
提示文件和原始库需要c++ 11的支持.所以需要在命令里加上-std=c++11或者-std=gnu++11.
g++ -std=gnu++11 ibeo_socket.cpp base64.cpp lidar_ready.cpp robo16_socket.cpp tinyxml2.cpp vlp16_socket.cpp -fPIC -shared -o liblidar.so
终端运行指令后,在当前目录下成功生成一个.so文件LINUX下C++生成.so文件及编译生成可执行文件的过程
2.将.so文件编译生成可执行文件
终端cd进入当前目录,输入指令
export LD_LIBRARY_PATH=$(pwd)
输入后可以从当前目录下调用刚才生成的共享库,不输入的话会默认从\usr\lib文件夹调用.
终端输入
g++ -std=gnu++11 -o IV_Lidar dbcparser.cpp -L. -llidar
此处IV_Liar是编译后生成的可执行文件的名称,dbcparser.cpp是我main函数的.cpp文件.-llidar与第一步生成的.so库名称相对应,如果库名称是libgood.so则这里改为-lgood.LINUX下C++生成.so文件及编译生成可执行文件的过程
运行指令后出现报错,发现系统的lcm库和pthread库没有被调用到.还需在原指令中加上-llcm和-lpthread
g++ -std=gnu++11 -o IV_Lidar dbcparser.cpp -llcm -lpthread -L. -llidar
LINUX下C++生成.so文件及编译生成可执行文件的过程
IV_Lidar可执行文件生成成功