cmake 生成Makefile,该Makefile根据构建目标使用不同的标志构建相同的可执行文件

p8ekf7hl  于 2023-05-29  发布在  其他
关注(0)|答案(2)|浏览(116)

如何编写CMakeLists.txt文件,以便CMake生成功能等同于

all: proj

debug: CXXFLAGS += -DDEBUG -g -Og
debug: proj

proj: 
    $(CXX) $(CXXFLAGS) main.cpp -o proj

换句话说,我希望能够在相同的文件夹中使用make [build_target]构建相同的可执行文件,但这取决于构建目标,使用不同的标志。
目前我有

cmake_minimum_required(VERSION 3.12)

set(PROJ_NAME "proj")

project(${PROJ_NAME} CXX)
add_executable(${PROJ_NAME} main.cpp)

add_custom_target(debug)
target_compile_definitions(debug PUBLIC -DDEBUG -g -Og)

但是当我调用CMake时,我得到一个错误,说target_compile_definitions called with non-compilable target type,我不知道如何使它“可编译”。

qvtsj1bj

qvtsj1bj1#

这不是CMake的设计用途。生成的构建系统中的目标被设计为具有一组稳定的编译选项(标志)。如果你想改变这些标志,需要重新生成buildsystem。从性能的Angular 来说,这通常是一件好事。我建议您只生成两个构建系统--一个用于调试,另一个用于其他任何功能(我假设发布?这是在CMake中使用单配置构建系统(与multi-config generators相反)时的惯用做法。

wvmv3b1j

wvmv3b1j2#

通常,您可以通过更改配置来构建其他目标,或者为每个配置设置构建目录来实现这一点,也就是说,如果您没有使用多配置生成器的话。对于依赖于配置的选项,您可以使用生成器表达式,例如:

target_compile_definitions(proj PRIVATE $<$<CONFIG:DEBUG>:DEBUG>)

如果您想用不同的构建系统目标构建相同的源,则需要创建不同的cmake目标。

set(SOURCES main.cpp)

add_executable(${PROJ_NAME} ${SOURCES})

add_executable(${PROJ_NAME}_debug ${SOURCES})
target_compile_definitions(${PROJ_NAME}_debug PRIVATE DEBUG)
target_compile_options(${PROJ_NAME}_debug PUBLIC PRIVATE -g -Og)

您可能需要更改输出名称,但对两个目标使用相同的输出文件路径会有问题,因此请确保将它们放在不同的目录中

set_target_properties(${PROJ_NAME}_debug PROPERTIES
    OUTPUT_NAME ${PROJ_NAME}

    #set use different output dir to avoid name conflict with other exe output
    RUNTIME_OUTPUT_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}/debug_bin
)

相关问题