为了简化依赖,我们使用包装库来包装第三方库,比如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中使用公共关键字或接口关键字,但不起作用。有人能帮帮我吗?
发布于 2020-01-08 20:30:27
我建议使用包装器库作为接口库。例如:
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还将包括第三方库的所有include文件夹。
关于cmake中接口目标的更完整的教程可以在这里找到,例如:http://mariobadr.com/creating-a-header-only-library-with-cmake.html
https://stackoverflow.com/questions/59641540
复制相似问题