Linux下测试本地编译未安装的库,如何避开系统库编译测试程序?
你遇到的核心问题是头文件路径指定错误,以及缺少运行时动态库路径的配置。下面分两种方法解决:
一、手动指定编译链接参数(适合理解原理)
1. 修正头文件包含路径
你之前直接指定了-I/home/user/testing/glib2/glib-2.70/gio,但glib的头文件是按<gio/giotypes.h>这种相对顶层glib目录的结构组织的。正确的做法是添加本地glib的顶层头文件目录,以及glib编译生成的config头文件目录:
- 假设你本地编译的glib,头文件在
/home/user/testing/glib2/usr/include/glib-2.0 - 编译生成的config头文件(比如
glibconfig.h)通常在库目录下的glib-2.0/include,即/home/user/testing/glib2/usr/lib64/glib-2.0/include
所以编译时的头文件参数应该是:-I/home/user/testing/glib2/usr/include/glib-2.0 -I/home/user/testing/glib2/usr/lib64/glib-2.0/include
这样编译器遇到<gio/giotypes.h>时,会自动在glib-2.0/gio/路径下找到对应文件,不会去系统目录查找。
2. 修正链接与运行时参数
除了-L指定库路径,还要添加-Wl,-rpath参数,告诉动态链接器运行时优先加载本地库,避免调用系统安装的glib:
完整编译命令示例:
gcc -g3 ./my_test_program.c -o my_test_program \ -I/home/user/testing/glib2/usr/include/glib-2.0 \ -I/home/user/testing/glib2/usr/lib64/glib-2.0/include \ -L/home/user/testing/glib2/usr/lib64 \ -Wl,-rpath=/home/user/testing/glib2/usr/lib64 \ -lgio-2.0 -lglib-2.0 -lgobject-2.0
注意:链接glib相关库时最好指定完整版本后缀(比如-lgio-2.0),避免冲突;同时要把glib依赖的所有库都加上(比如glib、gobject),否则可能出现链接错误。
二、用pkg-config自动生成参数(推荐,减少手动错误)
glib编译完成后会生成对应的pkg-config配置文件(.pc),存放在本地库目录的pkgconfig子目录下(比如/home/user/testing/glib2/usr/lib64/pkgconfig)。通过设置PKG_CONFIG_PATH环境变量指定本地配置文件路径,就能让pkg-config自动输出正确的编译链接参数:
1. 设置环境变量
export PKG_CONFIG_PATH=/home/user/testing/glib2/usr/lib64/pkgconfig:$PKG_CONFIG_PATH
这个命令会让pkg-config优先查找本地的配置文件,而不是系统默认路径。
2. 编译测试程序
直接用pkg-config输出的参数编译:
gcc -g3 ./my_test_program.c -o my_test_program \ $(pkg-config --cflags gio-2.0) \ $(pkg-config --libs gio-2.0) \ -Wl,-rpath=$(pkg-config --variable=libdir gio-2.0)
--cflags会自动生成所有需要的头文件包含参数--libs会自动生成所有需要的库链接参数--variable=libdir会自动获取本地glib的库目录,配合-rpath设置运行时路径
关键说明
- 绝对不要安装对应版本的glib-devel包,否则系统的pkg-config会优先使用系统版本的配置,导致链接到系统库。
- 如果临时运行程序,也可以通过设置
LD_LIBRARY_PATH临时指定动态库路径:
但LD_LIBRARY_PATH=/home/user/testing/glib2/usr/lib64 ./my_test_program-Wl,-rpath是把路径嵌入到程序二进制文件中,更方便长期使用。
内容的提问来源于stack exchange,提问作者the_endian

