生成生成 makefile 时不包括 cmake C++11 标志
cmake c++11 flag not included when makefile is generated
我有以下CMakeLists文件:
#################
# Com Project #
#################
CMAKE_MINIMUM_REQUIRED(VERSION 2.6)
SET(CMAKE_MODULE_PATH /home/loay/Desktop/V5)
SET(CMAKE_CXX_FLAGS "-std=c++11")
PROJECT (Sync)
FIND_PACKAGE (OpenSplice REQUIRED)
#####################
# Modele de donnees #
#####################
SET (idls
Communication.idl
)
# Extraction des fichiers a partir du .idl
execute_process(COMMAND idlpp -S -l cpp ./Communication.idl)
FOREACH(idl ${idls})
OpenSplice_IDLGEN (${idl})
STRING (REGEX REPLACE "(.*).idl" "\1.cpp" VARS_1 ${idl})
STRING (REGEX REPLACE "(.*).idl" "\1.h" VARS_2 ${idl})
STRING (REGEX REPLACE "(.*).idl" "\1Dcps.cpp" VARS_3 ${idl})
STRING (REGEX REPLACE "(.*).idl" "\1Dcps.h" VARS_4 ${idl})
STRING (REGEX REPLACE "(.*).idl" "\1Dcps_impl.cpp" VARS_5 ${idl})
STRING (REGEX REPLACE "(.*).idl" "\1Dcps_impl.h" VARS_6 ${idl})
STRING (REGEX REPLACE "(.*).idl" "\1SplDcps.cpp" VARS_7 ${idl})
STRING (REGEX REPLACE "(.*).idl" "\1SplDcps.h" VARS_8 ${idl})
STRING (REGEX REPLACE "(.*).idl" "ccpp_\1.h" VARS_9 ${idl})
SET(OpenSplice_SYNC ${OpenSplice_SYNC} ${VARS_1} ${VARS_2} ${VARS_3} ${VARS_4} ${VARS_5} ${VARS_6} ${VARS_7} ${VARS_8} ${VARS_9})
ENDFOREACH(idl)
###########################
# Fichiers de code source #
###########################
SET (APP_SOURCES
arduino.cpp
Controller.cpp
CheckStatus.cpp
Controller.cpp
ListenerReader.cpp
main.cpp
Publisher.cpp
Subscriber.cpp
rs232.c
)
# Inclure dossier des sources des librairies a linker
INCLUDE_DIRECTORIES(
${OpenSplice_INCLUDE_DIRS}
)
# Inclure dossier des binaires des librairies a linker
link_directories (
${LIBRARY_OUTPUT_PATH}
)
#############################
# Construction des binaires #
#############################
SET (APP_EXE start)
SET (SYNC Sync)
ADD_EXECUTABLE (${APP_EXE} ${APP_SOURCES})
ADD_LIBRARY (${SYNC} SHARED ${OpenSplice_SYNC})
ADD_DEFINITIONS (
${OpenSplice_DEFINITIONS}
${DEFINITIONS}
)
TARGET_LINK_LIBRARIES (${SYNC}
${OpenSplice_LIBRARIES}
)
TARGET_LINK_LIBRARIES (${APP_EXE}
${OpenSplice_LIBRARIES}
${SYNC}
)
如您所见,我SET(CMAKE_CXX_FLAGS "-std=c++11")
添加了此行以启用对ISO c ++ 2011的支持。我运行此命令cmake . -G "Unix Makefiles"
生成我需要的文件并生成生成文件。
问题是当我运行make
命令时,它会失败并显示以下错误:
错误: #error 此文件需要编译器和库支持 ISO C++ 2011 标准。此支持目前处于实验阶段,必须使用 -std=c++11 或 -std=gnu++11 编译器选项启用。
这很奇怪,因为我确实包括了旗帜。更奇怪的是,当我重新运行cmake . -G "Unix Makefiles"
时,这个问题就解决了,我能够毫无错误地构建我的文件!
这个问题的原因可能是什么?
可能它在其他地方被覆盖了,因为这个CMake文件不是PrismTech的官方文件。将该命令更改为以下内容:
set(CMAKE_CXX_FLAGS "-std=c++11 ${CMAKE_CXX_FLAGS}")
并将其放在 cmake 文件的末尾。
在调用之前或之后设置编译器标志时project()
存在差异。
在调用之前设置标志
project()
通常会重新定义默认标志:set(CMAKE_CXX_FLAGS_INIT "<new-value>" CACHE STRING "Flags used by the compiler during all build types.") # ... some other assignments may be here ... project(<project-name>)
注意变量
_INIT
后缀:实际上,标志是在调用project()
时初始化的,CMAKE_CXX_FLAGS_INIT为它们提供默认值。在调用后设置标志
project()
通常会附加到默认标志或用户提供的标志中:project(<project-name>) # ... set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} <additional-value>")
相关文章:
- 使用 c++11 标志交叉编译 OpenWRT
- 生成生成 makefile 时不包括 cmake C++11 标志
- 不能在 Solaris 的最新编译器中使用带有新 c+11 标志的 xercesc
- Cmake没有使用C++11标志使用CXX_STANDARD
- QT 5.7将-STD = GNU 11添加到我的编译器标志,Clobbering -Std = C 14
- C 11 -Chrono文件的编译器标志找不到
- 通过宏定义编译标志(C++11 和优化)
- C++11:pthreads、静态类函数和-pg标志的兼容性
- 类型安全的c++11枚举类标志的模板
- Qmake 不使用 stdc++11 编译标志
- 通过GCC标志-std=c++11 CXXFLAGS或CXX或CFLAGS
- 为什么C++11编译器支持仍然需要一个标志
- C++11 to_string使用代码::块 -std=c++11 标志已选定
- -std=c++11 编译器标志是否会在某个时候成为默认值
- 如何在 c++ 中使用带有 gcc 4.8 且不带 C++11 标志的正则表达式
- C++11检查标志的方法
- 我应该使用什么标志来强制执行一个好的C++11样式
- -gcc/g++4.4.6中无法识别std=c++11标志
- c文件禁用-std=c++11标志
- 当使用英特尔编译器和 -std=c++11 标志时,NVCC 不起作用