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

标签 c++ gcc memory cmake resources

底部的最小工作示例。

假设我想为特定的 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() {}

最佳答案

问题是 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")

关于c++ - CMake:使用 target_compile_options 设置 ggc-min-expand 和 -heapsize,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52212419/

相关文章:

c - 在 gcc 中编译 SHA1( ) 函数失败。 c语言

java - 使用php获取内存使用情况

c - 指向内存中指针的指针的大小

c++ - malloc() : memory corruption (fast) c++

c++ - GCC 中的元组模板

c++ - 尝试在 Eclipse CDT 中提取函数时出现 "Too many declarations in selection"错误消息

c++ - 在考虑对齐要求的同时一般重载 operator new

c - 为什么 volatile 适用于 setjmp/longjmp

c - 如何使用链接器将目标文件转换为可执行文件(C 目标文件)

c++ - 使用 this 关键字编译程序