Fork me on GitHub

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。

安装新库过程
动态库链接问题

posted @ 2020-08-07 20:47  wangzi199  阅读(2031)  评论(0编辑  收藏  举报