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 请问谁知道CMAKE如何使用?真正的初学者,win7系统,使用VS2005