CMake:使用 target_compile_options 设置 ggc-min-expand 和 -heapsize

Posted

技术标签:

【中文标题】CMake:使用 target_compile_options 设置 ggc-min-expand 和 -heapsize【英文标题】:CMake: Set ggc-min-expand and -heapsize with target_compile_options 【发布时间】:2018-09-06 21:31:34 【问题描述】:

底部的最小工作示例。

假设我想为特定的 CMake 目标修改 GCC 垃圾收集,将其命名为 foo。我的直觉是尝试,例如:

target_compile_options(foo <PRIVATE|INTERFACE|PUBLIC> --param ggc-min-heapsize=32768) 

这很好用。但如果我尝试:

target_compile_options(foo <PRIVATE|INTERFACE|PUBLIC> --param ggc-min-expand=1 --param ggc-min-heapsize=32768)

target_compile_options(foo <PRIVATE|INTERFACE|PUBLIC> --param ggc-min-expand=1)
target_compile_options(foo <PRIVATE|INTERFACE|PUBLIC> --param ggc-min-heapsize=32768)

我得到回应:

ggc-min-heapsize=32768: No such file or directory

在参数周围或每个参数周围添加引号没有帮助。我已经在 CMake 3.5.1 和 3.11、GCC 4.8 和 GCC 7 上尝试过,没有任何变化。

奇怪的是,老式的

SET(CMAKE_CXX_FLAGS "$CMAKE_CXX_FLAGS --param ggc-min-expand=1 --param ggc-min-heapsize=32768)

似乎工作得很好。我是否遗漏了有关 target_compile_options 的现代用法的一些内容?

最小的工作示例

CMakeLists.txt

cmake_minimum_required(VERSION 3.5.1 FATAL_ERROR)
project(test)

add_executable(test main.cpp) 
target_compile_options(test PRIVATE --param ggc-min-expand=1)
// Uncommenting the below causes compilation to fail
// target_compile_options(test PRIVATE --param ggc-min-heapsize=32768)

main.cpp

int main() 

【问题讨论】:

【参考方案1】:

问题在于 CMake 对传递给 target_compile_options 的标志进行了重复标记,因此它最终将“--param gcc-min-expand=1 gcc-min-heapsize=32768”传递给 gcc。这显然是错误的。有an issue 有人在抱怨它。

为了解决这个问题,一些新功能是recently added。您可以将选项括在引号中并添加 SHELL:。出于重复数据删除的目的,这些参数将被视为一个单元,但将作为多个参数传递给 gcc(就像被您的 shell 拆分一样)。此更改已在 CMake 3.12 中发布,因此您的发行版包管理器中的版本可能还没有。

cmake_minimum_required(VERSION 3.12.1 FATAL_ERROR)
project(example)

add_executable(example main.cpp) 
target_compile_options(example PRIVATE "SHELL:--param ggc-min-expand=1")
target_compile_options(example PRIVATE "SHELL:--param ggc-min-heapsize=32768")

【讨论】:

感谢清晰连贯的解释。这可能意味着是时候咬紧牙关,从源代码构建最新的 CMake。

以上是关于CMake:使用 target_compile_options 设置 ggc-min-expand 和 -heapsize的主要内容,如果未能解决你的问题,请参考以下文章

CMake中cmake_policy的使用

CMake的一些使用

【CMAKE】求助-cmake 请问谁知道CMAKE如何使用?真正的初学者,win7系统,使用VS2005

使用CMake组织C++工程3:CMake 函数和宏

CMake中cmake_minimum_required的使用

CMake安装和使用