为了简化依赖性,我们使用包装器库包装第三方库,例如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关键字,但是它不起作用。有人可以帮我吗?
答案 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中的接口目标的更完整的教程。