我想要在每个配置构建目录中生成文件:
add_executable(test_generator_gen test_generator.cpp)
target_compile_definitions(test_generator_gen PRIVATE GENERATE)
target_link_libraries(test_generator_gen YOMM2::yomm2)
add_custom_command(
OUTPUT ${GENERATED_FILES}
DEPENDS test_generator_gen
COMMAND test_generator_gen
WORKING_DIRECTORY $<TARGET_FILE_DIR:test_generator_gen>
)
文件生成在我想要的位置(例如./builds/headers-only/tests/Debug/test_generator_slots.hpp
和另一个文件)。我的问题是,我应该输入什么${GENERATED_FILES}
?如果我输入"${CMAKE_CURRENT_BINARY_DIR}/test_generator_slots.hpp"
,我就是在欺骗cmake
,文件会一次又一次地生成。我尝试了对我来说似乎很自然的方法:
add_custom_command(
OUTPUT $<TARGET_FILE_DIR:test_generator_gen>/test_generator_slots.hpp
DEPENDS test_generator_gen
COMMAND test_generator_gen
WORKING_DIRECTORY $<TARGET_FILE_DIR:test_generator_gen>
)
# ...
...但我收到一个错误:
CMake Error at tests/CMakeLists.txt:95 (add_custom_command):
[cmake] Error evaluating generator expression:
[cmake]
[cmake] $<TARGET_FILE_DIR:test_generator_gen>
[cmake]
[cmake] No target "test_generator_gen"
我很困惑。为什么同一命令中的同一生成器表达式对于某些参数可接受,而对于其他参数则不可接受?我该如何正确指定 OUTPUT?
cmake 3.22.1
虽然错误消息看起来很混乱,但文档很清楚:
众所周知,对于多配置生成器,可执行文件和库的默认输出目录名称与配置名称相同。因此,您可以使用
$<CONFIG>
表达式来表示它:为了使项目能够与多配置和单配置生成器一起工作,您需要使用
if
:或者,您可以明确设置CMAKE_RUNTIME_OUTPUT_DIRECTORY变量来控制可执行文件的输出目录。并在需要引用该目录时使用该变量: