链接通过依赖库链接的第三方库,请使用Cmake

时间:2020-01-08 07:52:22

标签: cmake

为了简化依赖性,我们使用包装器库包装第三方库,例如gradle。例如:

lib_wrapper->第三方库

A-> libWrapper

B-> libWrapper

因此,A,B可以使用第三方中的功能。但是我写的camke文件不起作用。

lib_wrapper cmake文件:

project(lib_wrapper)
# emty.c is an empty c file, do not use any ib_thirdparty funciton
add_library(lib_wrapper SHARED empty.c)

target_link_libraries(lib_wrapper lib_thirdparty1.a)
target_link_libraries(lib_wrapper lib_thirdparty2.a)
target_link_libraries(lib_wrapper lib_thirdparty3.a)

A的camke文件:

project(alib)
add_library(A SHARED a.c)

# add dependency
add_subdirectory(${lib_wrapper_path} lib_wrapper/out)
add_dependencies(alib lib_wrapper)
add_library(lib_wrapper_import SHARED IMPORTED)
set_target_properties(lib_wrapper_import PROPERTIES IMPORTED_LOCATION "${CMAKE_LIBRARY_OUTPUT_DIRECTORY}/lib_wrapper_import.so")

target_link_libraries(alib lib_wrapper_import)

我也尝试在target_link_libraries中使用PUBLIC或INTERFACE关键字,但是它不起作用。有人可以帮我吗?

1 个答案:

答案 0 :(得分:1)

我建议将包装器库作为接口库。例如:

project(lib_wrapper)
add_library(lib_wrapper INTERFACE)
target_link_libraries(lib_wrapper lib_thirdparty1.a)
target_link_libraries(lib_wrapper lib_thirdparty2.a)
target_link_libraries(lib_wrapper lib_thirdparty3.a)
target_include_directories(lib_wrapper INTERFACE <enter the third party include folders here>)

,然后在项目中:

project(alib)
add_library(A SHARED a.c)

# add dependency
add_subdirectory(${lib_wrapper_path})
target_link_libraries(alib lib_wrapper)

这实际上是cmake如何处理仅标头库的目标的方式。如果您添加了正确的路径,则调用接口库的target_include_directories也将包含第三方库的所有包含文件夹。

例如,可以在http://mariobadr.com/creating-a-header-only-library-with-cmake.html

中找到有关cmake中的接口目标的更完整的教程。