CMake:使用 target_compile_options 设置 ggc-min-expand 和 -heapsize
CMake: Set ggc-min-expand and -heapsize with target_compile_options
底部的最小工作示例。
假设我想为特定的 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")
底部的最小工作示例。
假设我想为特定的 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")