CMake:在配置过程中不同的编译器标志?

时间:2019-01-18 03:22:57

标签: gcc cmake

CMake 3.9,arm-gcc 5.4.1,Linux / OSX:

我通过在编译器标志中添加-fstack-protector-strong来启用stack smashing protection。这指示gcc在硬编码库libssp.alibssp_nonshared.a中查找特殊命名的符号。

这些库作为构建的一部分存在于我的应用程序中,但是当CMake在配置阶段询问我的编译器时,它们尚不存在。

这会导致CMake失败,这很有意义:

[2/2] Linking CXX executable cmTC_0f43d

FAILED: cmTC_0f43d

/path/to/arm-none-eabi-g++ -fstack-protector-strong
CMakeFiles/cmTC_0f43d.dir/testCXXCompiler.cxx.obj -o cmTC_0f43d

/path/to/arm-none-eabi/bin/ld: cannot find -lssp_nonshared
/path/to/arm-none-eabi/bin/ld: cannot find -lssp

有什么方法可以

  1. 告诉CMake在编译器询问期间不使用-fstack-protector-strong吗?
  2. 在审问期间提供libssplibssp_nonshared的空“虚拟”版本吗?
  3. 完全跳过编译器询问吗? (这是一个自定义工具链。)

或其他解决方法?

2 个答案:

答案 0 :(得分:1)

  

告诉CMake在编译器询问期间不使用-fstack-protector-strong吗?

在CMake检查编译器时,只需在project()调用后之后添加此编译器标志即可。

project(MyProject)
# ...
set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -fstack-protector-strong")
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -fstack-protector-strong")

除了将标志附加到CMAKE_*_FLAGS变量之外,还可以通过add_compile_options命令将其添加:

project(MyProject)
# ...
add_compile_options("-fstack-protector-strong")

答案 1 :(得分:0)

就我而言,选择3十分简单。在我的工具链CMake文件中,我简单地添加了:

set(CMAKE_C_COMPILER_WORKS ON)
set(CMAKE_CXX_COMPILER_WORKS ON)

现在CMake不再浪费任何时间来查询我的编译器的功能。

这在我的特定情况下(嵌入式系统固件)有效,但是如何使CMake和-fstack-protector-strong在非嵌入式程序上运行也很好。