如何在CMake中实现构建时链接一个库名,运行时用另一个?
解决方案
方法1:直接链接到库文件路径
如果明确libcrypto2.so的具体位置,直接在链接时指定完整路径即可:
add_executable(foo a.c) # 替换为libcrypto2.so的实际路径,比如/usr/local/custom/lib/libcrypto2.so target_link_libraries(foo "/path/to/your/libcrypto2.so")
CMake会直接将该库文件关联到可执行文件,运行时会遵循库的SONAME(libcrypto2.so)进行查找。
方法2:正确配置IMPORTED目标
之前使用IMPORTED目标无效大概率是属性配置不全,按以下方式正确设置:
add_executable(foo a.c) # 创建IMPORTED共享库目标 add_library(crypto2 SHARED IMPORTED) # 设置库文件的实际路径 set_target_properties(crypto2 PROPERTIES IMPORTED_LOCATION "/path/to/your/libcrypto2.so" # 若需要关联头文件路径,可添加以下配置 # INTERFACE_INCLUDE_DIRECTORIES "/path/to/openssl/headers" ) # 将目标链接到foo target_link_libraries(foo crypto2)
这种方式可以复用crypto2目标,方便统一管理依赖的头文件、编译选项等。
方法3:用find_library自动定位库
如果libcrypto2.so所在目录已在系统库搜索路径,或者可以手动指定搜索目录,用find_library自动查找:
add_executable(foo a.c) # 查找libcrypto2.so,可指定自定义搜索路径 find_library(CRYPTO2_LIB NAMES crypto2 PATHS "/path/to/custom/lib" # 替换为实际搜索目录 ) # 链接找到的库 target_link_libraries(foo ${CRYPTO2_LIB})
若find_library成功匹配,CRYPTO2_LIB会被赋值为库的完整路径,直接用于链接即可。
运行时路径补充
为确保运行时系统能找到libcrypto2.so,可通过添加-rpath参数指定运行时搜索路径:
target_link_options(foo PRIVATE "-Wl,-rpath,/path/to/your/lib")
也可以通过设置LD_LIBRARY_PATH环境变量临时指定搜索路径。
内容的提问来源于stack exchange,提问作者Lewis Chan
相关产品推荐
相关产品推荐

