C++新库安装过程
C++新库安装过程
Configure
Configure文件:是一个sh脚本文件,这一步一般是检查当前系统的依赖环境问题,最后生成对应的Makefile文件,一般会在结尾跟上安装的目录(默认在/usr/local下)
--prefix: 自定义安装的目录
-exec-prefix=EPREFIX: 依赖库的目录,如果不指定,将默认为prefix中指定的目录
./Configure --prefix=/tmp/usr/local/
make
按照上述生成的Makefile来编译新库,编译新库时依赖的其他静态库和动态库在这一步完成。
make
make install
生成新库的头文件以及动态库与静态库,头文件放在/usr/local/include中,静态库和动态库放在/usr/local/lib中,.a或者.so,以备使用。由于涉及到写文件,所以需要sudo权限。
sudo make install
将新建的库作为一个独立的模块进行使用
当使用一个第三方依赖库的时候,我们可以将第三方库的.h和.a、.so当做一个文件夹放在项目目录下,在项目的Makefile中写出依赖的头文件路径和库文件路径
INCLUDES:= -I. -I./third_party/include
LDFLAGS:= -Wl,-rpath,/third_party/lib,-rpath,/lib/,-rpath,/usr/lib/,-rpath,/usr/local/lib
$(EXECUTABLE): $(ALL_OBJECTS)
$(CC) $(ALL_OBJECTS) -o $@ $(LDFLAGS) // ALL_OBJECTS是其他依赖库的.o文件
%.o: %.cpp
$(CC) $(CFLAGS) $(INCLUDES) $< -o $@ // CFLAGS是一系列的c的配置,如 std=c++11这种
note: ./third_party/include和./third_party/lib都尽量包含进去,如若只包含前者忽略后者,编译不会报错误,但是加载动态库运行的时候,会报找不到动态库的错误(可以使用ldd [execute_file]命令查看)。动态链接时,linux共享库链接器ld.so来链接动态库,ld.so寻找动态库的顺序如下:
- ELF可执行文件中动态段中DT_RPATH所指定的路径。即在编译目标代码时, 对gcc加入链接参数“-Wl,-rpath”指定动态库搜索路径
gcc -Wl,-rpath,/home/arc/test,-rpath,/lib/,-rpath,/usr/lib/,-rpath,/usr/local/lib test.c
- 环境变量LD_LIBRARY_PATH 指定的动态库搜索路径
export LD_LIBRARY_PATH=/tmp/local/lib/
- /etc/ld.so.cache中所缓存的动态库路径,这个可以通过先修改配置文件/etc/ld.so.conf中指定的动态库搜索路径,然后执行ldconfig命令来改变。
- 默认的动态库搜索路径/lib、/usr/lib、/usr/local/lib。