假设我的项目使用
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文件貌似可行,但显然不是一个正经的做法