编译共享库遇`can not be used when making a shared object`错误求助
解决Linux下静态库链接到共享库的R_X86_64_PC32重定位错误
从你的描述来看,核心问题是静态库libLASlib.a的目标文件没有用-fPIC编译,导致无法链接到共享库lib1.so中。虽然你尝试添加了-fPIC,但大概率是CMake的配置没正确把这个参数传递到libLASlib的编译流程里。下面是具体的解决方案:
1. 强制libLASlib的CMake目标启用PIC
如果libLASlib是你通过CMake构建的,直接在它的CMakeLists.txt里给静态库目标设置POSITION_INDEPENDENT_CODE属性:
# 假设你的静态库定义是这样的 add_library(LASlib STATIC lasreader.cpp # 其他源文件... ) # 强制启用PIC,让所有目标文件都用-fPIC编译 set_target_properties(LASlib PROPERTIES POSITION_INDEPENDENT_CODE ON)
这个属性在CMake 2.8.9及以上版本生效,会自动给所有源文件添加-fPIC编译参数(仅Linux下生效,Windows无需处理)。
2. 验证PIC是否真的生效
如果环境限制没法直接查看gcc命令行,可以通过目标文件的信息来验证:
- 对单个
.o文件执行:objdump -x lasreader.cpp.o | grep -i pic
如果输出里有FLAGS: ... PIC或者PIE相关标记,说明PIC已经启用;如果没有,说明编译时没加上-fPIC。 - 或者用
readelf -h lasreader.cpp.o查看,在Flags字段里找PIE或PIC字样。
3. 清理旧构建产物再重新编译
很多时候旧的非PIC目标文件会被保留在静态库中,即使你改了CMake配置。所以一定要:
- 删除libLASlib的整个build目录
- 或者执行
make clean(如果用Makefile生成器)/ninja clean(如果用Ninja) - 然后重新执行
cmake ..和构建命令。
4. 如果libLASlib是外部依赖(比如用ExternalProject_Add引入)
如果是通过CMake的ExternalProject_Add拉取并构建libLASlib,需要在配置参数里传递PIC相关选项:
ExternalProject_Add(libLASlib GIT_REPOSITORY https://your-liblas-repo-url.git CMAKE_ARGS -DCMAKE_BUILD_TYPE=Release # 强制启用PIC -DCMAKE_POSITION_INDEPENDENT_CODE=ON # 或者直接传递编译参数(适用于老版本CMake) # -DCMAKE_CXX_FLAGS="-fPIC" INSTALL_COMMAND "" )
为什么改成共享库就没问题?
因为CMake默认会给共享库目标启用POSITION_INDEPENDENT_CODE,所以构建libLASlib.so时所有源文件都会自动用-fPIC编译,自然不会出现重定位错误。
内容的提问来源于stack exchange,提问作者Pascal M
相关产品推荐
相关产品推荐

