这是我最顶级的CMakeLists.txt:
cmake_minimum_required(VERSION 3.10)
project(test LANGUAGES Fortran)
add_executable(main main.f90)
add_subdirectory(external)
target_link_libraries(main extlib)
子目录"外部"定义一个外部项目,它生成一些库和头文件。收集ExternalProject_add
的输出以便将其链接到主可执行文件的最佳做法是什么?目前,我正在使用INTERFACE库,如下所示:
include(ExternalProject)
ExternalProject_add(my-external
SOURCE_DIR ext_source
CONFIGURE_COMMAND
${CMAKE_CURRENT_LIST_DIR}/configure
--prefix=${CMAKE_CURRENT_BINARY_DIR}
BUILD_COMMAND make)
add_library(extlib INTERFACE)
add_dependencies(extlib my-external)
target_include_directories(extlib INTERFACE ${CMAKE_CURRENT_BINARY_DIR}/include)
foreach(_lib lib1 lib2 lib3)
target_link_libraries(extlib INTERFACE
${CMAKE_CURRENT_BINARY_DIR}/lib/${_lib}.a)
endforeach()
在网上搜索,在我看来,人们经常使用IMPORTED库来捕获ExternalProject_add
的结果。但是,您只能将一个IMPORTED库与ExternalProject_add
生成的一个文件连接起来,并且任何头目录都需要单独传播回父目录,以便main
可以使用它们。在我看来,INTERFACE库在这里比较好,因为你可以将外部项目产生的所有内容整合到一个目标中。在我的实际项目中,我有几个外部项目,理想情况下,我希望每个外部项目都有一个目标,以保持清洁。
一般来说,在处理外部库时应该使用IMPORTED或INTERFACE库,主要的好处是什么?
修改
根据下面的讨论,我尝试仅使用导入的库:
foreach(_lib lib1 lib2 lib3)
add_library(${_lib} STATIC IMPORTED GLOBAL)
add_dependencies(${_lib} my-external)
set_target_properties(${_lib} PROPERTIES
IMPORTED_LOCATION ${CMAKE_CURRENT_BINARY_DIR}/lib/${_lib}.a)
endforeach()
set_target_properties(lib1 PROPERTIES
INTERFACE_INCLUDE_DIRECTORIES ${CMAKE_CURRENT_BINARY_DIR}/include)
target_link_libraries(lib1 INTERFACE lib2 lib3)
它与接口库的工作量大致相同,我猜最终只是风格问题。