如何在 Linux 平台上正确链接动态库

问题描述 投票:0回答:0

假设我的项目使用

C++
语言,要链接的库使用
C
语言

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}/
)

使用它们

# not work
target_link_libraries(
        ${PROJECT_NAME}
        PRIVATE
        ${lib1_name}
        ${lib2_name}
)

# empty
get_target_property(
        my_project_linked_libraries
        ${PROJECT_NAME}
        LINK_LIBRARIES
)

# ---------------------------------------------------------

# work well
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文件貌似可行,但显然不是一个正经的做法

c++ linux cmake shared-libraries
© www.soinside.com 2019 - 2024. All rights reserved.