You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.28 05:13:25