相关疑难解决方法(0)

CMake变量的"option"和"set CACHE BOOL"有什么区别?

以下两个之间有什么区别吗?

set(FOO true CACHE BOOL "description")

option(FOO "description" ON)
Run Code Online (Sandbox Code Playgroud)

文档:set - 选项

背景:即使我已经使用CMake一段时间了,我option今天才注意到这个命令,因此我一直在使用set:我想知道用第二个替换第一个是否安全/值得.

boolean global-variables cmake cmake-gui

37
推荐指数
2
解决办法
1万
查看次数

CMake条件预处理器定义代码

我正在将一个makefile项目迁移到CMake.第一次编写makefile的人已经完成了一个用于在include文件中写入某些值的模块.

有一个主config.h文件,其中包含config_in.h.config.h文件包含以下内容:

#ifndef USE_FEATURE_A
#define USE_FEATURE_A 0
#endif

#ifndef USE_FEATURE_B
#define USE_FEATURE_B 0
#endif
Run Code Online (Sandbox Code Playgroud)

在makefile中有一个伪目标,就像with_feature_a在config_in.h中写的那样

#define USE_FEATURE_A 1
Run Code Online (Sandbox Code Playgroud)

通过这种方式,有人可以打字

make with_feature_a
make
Run Code Online (Sandbox Code Playgroud)

获得正确的构建.

我想使用这个代码库但使用CMake复制这样的东西.我在网上尝试了几种方法,但我没有让它发挥作用.

set_target_properties(with_feature_a PROPERTIES COMPILE_DEFINITIONS 
    "WITH_FEATURE_A=1"
)
Run Code Online (Sandbox Code Playgroud)

这不起作用,因为如果我跑

make with_feature_a
Run Code Online (Sandbox Code Playgroud)

我没有with_feature_a在预处理器命令行中看到.

我做的第二次尝试是直接用内容集写一个文件到我想要的东西,但我不明白如何将file()命令连接到我的目标.

我把它放在我的CMakeLists.txt中

file(WRITE 
local/config_in.h 
    "#define WITH_FEATURE_A 1"
)
Run Code Online (Sandbox Code Playgroud)

但这并不是每次都执行,我不知道如何将它设置为单个目标.

任何帮助表示赞赏.感谢您阅读所有这些内容.对不起长话:)

UPDATE

这里提供的解决方案是解决问题之路上的一大亮点.问题是不允许递归定义.我举了一个例子:

在CMakeLists.txt我放置:

if (WITH_FEATURE_A)
MESSAGE(STATUS "WITH_FEATURE_A")
add_definitions(-DUSE_FEATURE_A=1)
    add_definitions(-DWITH_FEABURE_B=1)
endif()

if (WITH_FEABURE_B)
MESSAGE(STATUS "WITH_FEATURE_B")
add_definitions(-DUSE_FEATURE_D=1)
endif()


if (WITH_FEABURE_C)
MESSAGE(STATUS "WITH_FEATURE_C")
add_definitions(-DUSE_FEATURE_D=1)
endif()


if (WITH_FEABURE_D)
MESSAGE(STATUS "WITH_FEATURE_D")
endif()
Run Code Online (Sandbox Code Playgroud)

在这种情况下,如果我用-DWITH_FEATURE_A = 1执行cmake,我很乐意在输出中看到: …

c preprocessor cmake

21
推荐指数
2
解决办法
3万
查看次数

什么会导致 CMake 选项不起作用?

我正在准备一个可以使用和不使用 GUI 的应用程序,所以我在我的 CMakeLists.txt 中使用命令

option (NEED_GUI "Include Qt support"  OFF) 
Run Code Online (Sandbox Code Playgroud)

if (NEED_GUI)
  message("****GUI should be OFF****")
  add_subdirectory(QtGUI)   # The Qt-based graphics routines
endif (NEED_GUI)
Run Code Online (Sandbox Code Playgroud)

尽管我将选项设置为 OFF,但我还是收到了消息并构建了库。在哪里查找错误?

qt cmake option

2
推荐指数
1
解决办法
5627
查看次数

标签 统计

cmake ×3

boolean ×1

c ×1

cmake-gui ×1

global-variables ×1

option ×1

preprocessor ×1

qt ×1