使用动态库的方式编译程序
-
创建一个hello_slam.cpp文件,将需要实现的功能放在这个文件中
#include <iostream> #include "print_slam.h" // 后续创建库文件的头文件时使用的 using namespace std; int main(int argc, char **argv) { print_slam(); return 0; }
-
生成一个库文件的print_slam.cpp文件,用于后续编译成动态库使用
#include <iostream> using namespace std; void print_slam() { cout << "HELLO SLAM!!" << endl; }
-
生成一个库文件的print_slam.h文件,用于后续调用动态库时使用的头文件
#ifndef PRINT_SLAM_H_ #define PRINT_SLAM_H_ void print_slam(); #endif
-
创建一个动态库文件libprint_slam.so(注意动态库在命名的时候需要注意规则,名字需要一lib开头,这样后期编译的时候才能找到库文件)
g++ -shared -fPIC print_slam.cpp -o libprint_slam.so
-
更新环境变量,将当前程序所在目录添加到环境变量中,这样在执行程序的时候才能找到动态库的位置
export LD_LIBRARY_PATH=.:$LD_LIBRARY_PATH
-
生成可执行文件,这时候需要使用到几个参数 (-L -l(小写的L,后面需要跟上动态库的名字,这时候不需要将lib打上,只需要lib后面的名字即可)
g++ hello_slam.cpp -o hello -L . -l print_slam
==NOTE:==通过
L
参数指定库文件的地址;-l
(小写的L)指定动态库的名字; -
执行可执行文件
./hello
如果之前没有导入环境变量的话,这里直接执行是会报错的,上面讲的导入环境变量的方法只限于在同一个终端使用,如果再开一个终端的话 还需要重新导入一次环境变量,只在当前shell中起作用
./hello: error while loading shared libraries: libprint_slam.so: cannot open shared object file: No such file or director
导入环境变量的几种方法
方法一: export LD_LIBRARY_PATH=LD_LIBRARY_PATH:/XXX 但是登出后就失效
方法二: 修改~/bashrc
或~/.bash_profile
或系统级别的/etc/profile
加粗样式举例:修改~/.bashrc
的方法
通过使用在.bashrc文件中添加环境变量,并source(相当于将更改后的设置文件重新启动一下,不需要重新登录系统就可生效)之后,就不用每次打开新的终端执行可执行文件的时候都需要添加环境变量了
export LD_LIBRARY_PATH=~/slam_learning/ch2/ch2_test:$LD_LIBRARY_PATH
NOTE::
和$
符号之间没有空格,添加空格的话 就会发现没添加上正确的路径
方法三:这个没有修改LD_LIBRARY_PATH但是效果是一样的实现动态库的查找(试验了一下没有成功)
-
/etc/ld.so.conf下面加一行/usr/local/mysql/lib
-
保存过后ldconfig一下(ldconfig 命令的用途,主要是在默认搜寻目录(/lib和/usr/lib)以及动态库配置文件/etc/ld.so.conf内所列的目录下,搜索出可共享的动态链接库(格式如前介绍,lib*.so*),进而创建出动态装入程序(ld.so)所需的连接和缓存文件.缓存文件默认为/etc/ld.so.cache,此文件保存已排好序的动态链接库名字列表.)
方法三设置稍微麻烦,好处是比较不受用户的限制。