我有一个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 上获取Debug
和Release
子目录吗?)
该FetchContent
模块能否让我更好地访问所包含项目的输出?我在那里的文档中看不到任何明显的东西。
Idk,我已经尝试了很多想法,但到目前为止没有任何效果。我觉得我可能遗漏了一些基本的东西——这是我第一次使用ExternalProject
. 有小费吗?