一个工程包含三部分,头文件(.h),库文件(.cpp),源文件(.cpp)。
1. 头文件是包含各种#include 和 函数声明等等信息,用于解释说明库文件。
2. 库文件(.cpp)是包含所有函数的.cpp文件,通过将库文件编译成.so或者.a文件,这样只需提供.so或者.a以及头文件就可以方便其他人调用库文件中的函数了。
编译的方式有可以用g++或者cmake的方式。
(1) g++ 编译.so文件
(2) cmake编译.so文件
3. 源文件指的是包含main()函数的.cpp文件,在源文件中需要#include头文件,然后就可以调用库文件中的函数了。
最后,把main.cpp和.so文件编译成可执行文件。
(1) g++ 编译可执行文件
我将libhello.so和main.cpp放在同一个目录下,那么g++编译的时候,需要先用-L. 声明在同一个目录下寻找.so文件,用-lhello确定需要链接的 .so文件 libhello.so,用-l链接的时候 把libhello.so省略为hello,-o 生成名字为main的可执行文件。
g++ main.cpp -L. -lhello -o main
因为libhello.so是我们自定义的.so文件,在编译时可能没问题,但是执行./main是会报错,error while loading shared libraries, 遇到这个问题,
默认情况下,编译器只会使用/lib和/usr/lib这两个目录下的库文件,通常通过源码包进行安装时,如果不指定--prefix,会将库安装在/usr/local/lib目录下;当运行程序需要链接动态库时,提示找不到相关的.so库,会报错。也就是说,/usr/local/lib目录不在系统默认的库搜索目录中,需要将目录加进去。系统默认的搜索库路径在/etc/ld.so.conf文件中,比如我自定义的.so文件的路径是 /home/nihao/lib/libhello.so , 那么操作如下:
sudo gedit /etc/ld.so.conf
注意输入的路径是目录,不要加上libhello.so,然后保存终端继续输入
sudo ldconfig
使所有的库文件都被缓存到文件/etc/ld.so.cache中,如果没做,可能会找不到刚安装的库。
再输入g++ main.cpp -L. -lhello -o 编译没问题,./main也没有问题。
该问题参考https://blog.csdn.net/hankerbit/article/details/83834349
(2) cmake编译可执行文件