如何处理ExternalProject_add的输出? IMPORTED vs INTERFACE库

时间:2018-03-10 00:02:02

标签: cmake

这是我最顶级的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)

它与接口库的工作量大致相同,我猜最终只是风格问题。

0 个答案:

没有答案