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

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了CMake:使用target_compile_options设置ggc-min-expand和-heapsize相关的知识,希望对你有一定的参考价值。

底部的最小工作示例。

假设我想修改特定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的现代用法的内容?

Minimal Working Example

的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")

以上是关于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安装和使用