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

时间:2018-09-06 21:31:35

标签: 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() {}

1 个答案:

答案 0 :(得分:2)

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