修改单个库的CMake RPATH,保留其他库的RPATH设置
RPATH与运行时链接问题求助
场景
我有一个小型应用MyApp,链接到共享库MyLibrary。MyLibrary依赖SafeNet提供的PKCS11共享库与PKCS11 USB令牌通信,该SDK的共享库路径为/opt/safenet/protecttoolkit5/ptk/lib/libcryptoki.so。使用现有CMake文件构建后应用可正常运行,ldd显示MyApp依赖该路径下的libcryptoki.so。
问题
PKCS11中间件支持通过符号链接替换,我们已创建符号链接/lib/libcryptoki.so指向/usr/lib/libeToken.so(USB PKCS11中间件)。测试阶段希望让MyApp运行时加载/lib/libcryptoki.so而非SDK路径下的库,但当前RPATH设置导致应用仍优先使用SDK路径的库。需要调整CMake配置实现这一需求(后续Debian构建会移除相关RPATH信息,仅需解决测试阶段的问题)。
已尝试方案
- 禁用RPATH:设置
set(CMAKE_SKIP_RPATH TRUE),此时libcryptoki.so可正确指向/lib下的库,但MyApp无法找到同目录下的MyLibrary。 - 移除
link_directories配置:CMake会选取/lib/libcryptoki.so,但会跟随符号链接将依赖硬编码为libeToken.so,失去中间件的可替换性。
疑问
- 如何让方案1生效?或者能否让CMake不跟随符号链接,即链接指定路径的库,但运行时RPATH指向目标路径?
- 优先选择无需手动设置
LD_LIBRARY_PATH或手动剥离RPATH信息的解决方案。
内容的提问来源于stack exchange,提问作者swaechter
相关产品推荐
相关产品推荐

