1

我有一个CMakeLists.txt看起来像这样的小项目:

include(ExternalProject)
ExternalProject_Add(gainput_project
  PREFIX gainput
  GIT_REPOSITORY https://github.com/jkuhlmann/gainput.git
  GIT_TAG e21b15f0bc3dd3f1a745fe89a966a2457e940142
  INSTALL_COMMAND ""
)
ExternalProject_Get_Property(gainput_project SOURCE_DIR)
ExternalProject_Get_Property(gainput_project BINARY_DIR)
set(GAINPUT_SOURCE_DIR "${SOURCE_DIR}")
set(GAINPUT_BINARY_DIR "${BINARY_DIR}")

add_executable(demo main.cpp)
add_dependencies(demo gainput_project)

target_include_directories(demo PUBLIC
  SYSTEM ${GAINPUT_SOURCE_DIR}/lib/include
)

# TODO: this is bad
if(WIN32)
  target_link_libraries(demo PUBLIC
    debug ${GAINPUT_BINARY_DIR}/lib/Debug/gainput-d.lib
    optimized ${GAINPUT_BINARY_DIR}/lib/Release/gainput.lib
  )
else()
  target_link_libraries(demo PUBLIC
    debug ${GAINPUT_BINARY_DIR}/lib/gainput-d.so
    optimized ${GAINPUT_BINARY_DIR}/lib/gainput.so
  )
endif()

显然,这些呼吁target_link_libraries并不理想。它们非常重复,我明确地编写了构建系统应该已经知道的路径和文件名。 处理来自外部项目的不同输出目录和文件名的最佳方法是什么?

有没有办法可以查询外部项目以获取实际的输出目录?(例如通过ExternalProject_Get_Property?)我可以使用一些神奇的生成器表达式吗?(ExternalProject_Get_Property(gainput_project RUNTIME_OUTPUT_DIRECTORY)不起作用。)

似乎find_library可以工作,只是在配置时输出库不存在,所以失败了。

也许我应该将外部项目设置为INSTALL_DIR我控制并始终使用的一些硬编码目录?(它还会在 Windows 上获取DebugRelease子目录吗?)

FetchContent模块能否让我更好地访问所包含项目的输出?我在那里的文档中看不到任何明显的东西。

Idk,我已经尝试了很多想法,但到目前为止没有任何效果。我觉得我可能遗漏了一些基本的东西——这是我第一次使用ExternalProject. 有小费吗?

4

1 回答 1

0

正如@Tsyvarev 建议的那样,我通过切换ExternalProjectFetchContent然后使用生成器表达式来查找输出文件来解决这个问题:

include(FetchContent)
FetchContent_Declare(gainput
  PREFIX gainput
  GIT_REPOSITORY https://github.com/jkuhlmann/gainput.git
  GIT_TAG e21b15f0bc3dd3f1a745fe89a966a2457e940142
  INSTALL_COMMAND ""
)
FetchContent_MakeAvailable(gainput)

add_executable(demo main.cpp)
add_dependencies(demo gainput)

target_include_directories(demo PUBLIC
  SYSTEM ${gainput_SOURCE_DIR}/lib/include
)

target_link_libraries(demo PUBLIC
  $<TARGET_LINKER_FILE:gainput>
)
于 2020-08-23T03:02:04.720 回答