1.添加头文件(报错:“fatal error: ***.h: No such file or directory”)
1.1通过编译指令-I
添加
例如头文件位置/home/ubuntu/include/test.h
。
添加方式g++ main.cpp -I /home/ubuntu/include/
即可。
main.cpp
中可以直接包含头文件#include "test.h"
。
1.2通过设置头文件搜索路径
命令行export CPLUS_INCLUDE_PATH=CPLUS_INCLUDE_PATH:/home/ubuntu/include/
(临时)。
永久添加在~/.bashrc
文件中添加export CPLUS_INCLUDE_PATH=CPLUS_INCLUDE_PATH:/home/ubuntu/include/
并命令行执行source ~/.bashrc
(永久)。
1.3通过编译指令-include
添加(几乎不使用)
但是这个方法只能是在调用文件不用#include "test.h"
,直接在编译时候g++ main.cpp -include /home/ubuntu/include/test.h
这种方式不常用,且如果test.h
中还包含其他头文件还是会出问题。
2.添加库文件
2.1-L
参数和-l
参数,静态库(共享库)能编译运行,动态库只能通过编译,运行会有问题,参2.2
-L
参数跟着的是库文件所在的目录名
,且中间有无空格
均可以。再比如我们把libtest.so
放在/home/ubuntu/lib
目录下,那链接参数就是-L/home/ubuntu/lib -ltest
另外,大部分libxxxx.so
只是一个链接
-l
参数就是用来指定程序要链接的库,-l参数紧接着就是库名,那么库名跟真正的库文件名有什么关系呢?就拿数学库来说,他的库名是m
,他的库文件名是libm.so
或者libm.a
,很容易看出,把库文件名的头lib
和尾.so
或.a
去掉就是库名了。
注意:
.a
和so
在同一文件夹下会优先连接动态库。
此时,运行动态库编译结果文件会导致错误error while loading shared libraries: libtest.so: cannot open shared object file: No such file or directory
此时按照2.2
设置以下运行时环境即可,若是静态库则不需要此步骤。
2.2设置库路径环境变量
命令行export LIBRARY_PATH=LIBRARY_PATH:/home/ubuntu/include/
(临时)。
命令行export LD_LIBRARY_PATH=LD_LIBRARY_PATH:/home/ubuntu/include/
(临时)。
永久添加在~/.bashrc
文件中添加export LIBRARY_PATH=LIBRARY_PATH:/home/ubuntu/include/
和export LD_LIBRARY_PATH=LD_LIBRARY_PATH:/home/ubuntu/include/
并命令行执行source ~/.bashrc
(永久)。
如果是静态库则不需要操作LD_LIBRARY_PATH
,若是动态库(共享库)则需要操作LD_LIBRARY_PATH
LIBRARY_PATH
和LD_LIBRARY_PATH
的区别:
我们知道Linux下有2种库:j静态库和动态库(共享库)。如(这里)阐述的,静态库是在编译期间会被链接并拷贝到你的程序中,因此运行时不再需要该静态库。动态库在编译时并不会被拷贝到你的程序中,而是在程序运行时才被载入,因此在程序运行时还需要动态库存在,这时就会用到LD_LIBRARY_PATH
指定的路径去查找这个动态库。
2.3编译命令直接添加需要的库
直接在编译命令后面添加.a
或者.so
文件相对路径或者绝对路径g++ main.cpp -I /home/ubuntu/include/ /home/indemind/lib/libtest.a
或者g++ main.cpp -I /home/ubuntu/include/ /home/indemind/lib/libtest.so
无需设置其他环境能直接运行。
3.创建静态库动态库和动态库
用g++编译生成动态链接库 *.so 的方法
使用g++创建静态库
3.1动态库多次封装情况
最终调用时候需要将全部涉及到的动态库.so
编译连接到程序中,但是头文件是最终用到哪个库,只需要用到的最终头文件即可。例如:test1.cpp
,test2.cpp
和test3.cpp
与test.h
一起封装为libtest.so
,然后test4.cpp
和test4.h
封装为libtest4.so
,且test4.cpp
调用了libtest.so
中的函数,此时需要用到test.h
和libtest.so
文件,最后main.cpp
中若仅仅用到libtest4.so
中函数,且无论用到的函数是否涉及libtest.so
中的函数,则此时编译并运行需要libtest.so
,libtest4.so
和test4.h
三个文件。原因在于无论动态库还是静态库封装过程中,仅仅用到了全部.h
头文件,需要封装的.cpp
源文件,没涉及到动态库和静态库,所以最终编译并运行时候需要指明库文件位置。
参考:
gcc/g++使用第三方库时添加头文件路径和库文件路径的方法
g++编译时:No such file or directory