Linux平台下C++项目如何正确链接C语言动态库(CMake)
Linux平台下CMake正确链接C语言动态库的方法
背景说明
我的项目采用C++语言开发,待链接的动态库为C语言编写,基础CMake配置如下:
project(test) add_executable(${PROJECT_NAME} main.cpp)
Windows平台(使用MSVC编译器)下,我通过add_library+target_link_libraries的方式可正常链接动态库,配置如下:
set(this_library_name this_library) set(dll_path ${parent_path}/this_library.dll) set(lib_path ${parent_path}/this_library.lib) add_library( ${this_library_name} SHARED IMPORTED ) set_target_properties( ${this_library_name} PROPERTIES IMPORTED_LOCATION ${dll_path} IMPORTED_IMPLIB ${lib_path} LINKER_LANGUAGE C ) get_target_property( target_binary_directory ${PROJECT_NAME} RUNTIME_OUTPUT_DIRECTORY ) add_custom_command( TARGET ${PROJECT_NAME} POST_BUILD COMMAND ${CMAKE_COMMAND} -E make_directory ${target_binary_directory} COMMAND ${CMAKE_COMMAND} -E echo "Copying dll from '${dll_path}' to '${target_binary_directory}'." COMMAND ${CMAKE_COMMAND} -E copy_if_different ${dll_path} ${target_binary_directory}/ ) target_link_libraries( ${PROJECT_NAME} PRIVATE ${this_library_name} )
但该方法在Linux平台(使用GCC编译器)无法正常工作。我尝试照搬Windows的思路导入动态库,配置如下:
set(lib1_name lib1) set(lib1_path ${parent_path}/liblib1.so) add_library( ${lib1_name} SHARED IMPORTED ) set_target_properties( ${lib1_name} PROPERTIES IMPORTED_LOCATION ${lib1_path} LINKER_LANGUAGE C IMPORTED_NO_SONAME ON ) set(lib2_name lib2) set(lib2_path ${parent_path}/liblib2.so) add_library( ${lib2_name} SHARED IMPORTED ) set_target_properties( ${lib2_name} PROPERTIES IMPORTED_LOCATION ${lib2_path} LINKER_LANGUAGE C IMPORTED_NO_SONAME ON ) get_target_property( target_binary_directory ${PROJECT_NAME} RUNTIME_OUTPUT_DIRECTORY ) add_custom_command( TARGET ${PROJECT_NAME} PRE_BUILD COMMAND ${CMAKE_COMMAND} -E make_directory ${target_binary_directory} COMMAND ${CMAKE_COMMAND} -E echo "Copying so from '${lib1_path}' to '${target_binary_directory}'." COMMAND ${CMAKE_COMMAND} -E copy_if_different ${lib1_path} ${target_binary_directory}/ COMMAND ${CMAKE_COMMAND} -E echo "Copying so from '${lib2_path}' to '${target_binary_directory}'." COMMAND ${CMAKE_COMMAND} -E copy_if_different ${lib2_path} ${target_binary_directory}/ )
尝试链接时,通过导入的库名称链接无效:
# 无法生效 target_link_libraries( ${PROJECT_NAME} PRIVATE ${lib1_name} ${lib2_name} ) # 获取到的链接库为空 get_target_property( my_project_linked_libraries ${PROJECT_NAME} LINK_LIBRARIES ) # --------------------------------------------------------- # 直接链接文件路径可正常工作 target_link_libraries( ${PROJECT_NAME} PRIVATE ${lib1_path} ${lib2_path} ) # 获取到的链接库为:${parent_path}/liblib1.so;${parent_path}/liblib2.so get_target_property( my_project_linked_libraries ${PROJECT_NAME} LINK_LIBRARIES )
虽然直接链接.so文件路径能正常工作,但这并非规范做法,请问Linux平台下该如何正确配置CMake链接这类动态库?
内容的提问来源于stack exchange,提问作者Life4gal
相关产品推荐
相关产品推荐

