cmake:在不需要时添加C ++标准

时间:2017-02-20 16:36:32

标签: c++ linux cmake

使用cmake 3.7在Linux下构建C ++可执行文件时,我看到一个-std=gnu++11标志被添加到编译标志中。问题是,我已经手动添加了-std=c++1z标志,而这个新标志会覆盖我的标志。这只发生在可执行文件中,但我发现在文档中没有提到这一点。 CMAKE_CXX_STANDARD为空,在目标上设置CXX_STANDARD属性无效。有没有办法删除这个标志?

这似乎不仅限于可执行文件。

这是我的(简化)cmake:

set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++1z")    
find_boost(serialization system)    
find_package(Qt5Widgets REQUIRED)    
link_directories(${Boost_LIBRARY_DIRS})
include_directories(
    ${Boost_INCLUDE_DIRS}
    ${ZMQ_INCLUDE_DIR}
    ${CPPZMQ_INCLUDE_DIR}
)

if(WIN32)
    add_definitions(-DNOMINMAX)
endif()

add_executable(
    ${PROFILER_CLIENT_NAME}
    main.cpp
    MainWindow.cpp
    MainWindow.h
    ProfilerWidget.cpp
    ProfilerWidget.h
    TimelineWidget.cpp
    TimelineWidget.h
    ZmqReceiver.cpp
    ZmqReceiver.h
)

add_dependencies(${PROFILER_CLIENT_NAME} boost zeromq)

target_link_libraries(
    ${PROFILER_CLIENT_NAME}
    PRIVATE ${PROFILER_NAME}
    PRIVATE ${Boost_LIBRARIES}
    PRIVATE Qt5::Widgets
)

1 个答案:

答案 0 :(得分:1)

正如@florian所怀疑的那样,Qt5正在污染你的编译命令。使用类似的CMakeLists.txt

cmake_minimum_required(VERSION 3.7.2 FATAL_ERROR)

set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++1z")
set(BOOST_ROOT "/usr/local/opt/boost@1.55")
execute_process(COMMAND brew --prefix qt5
  COMMAND tr -d \\n
  OUTPUT_VARIABLE QT5_BREW_PATH)

find_package(Boost COMPONENTS serialization system)
find_package(Qt5 COMPONENTS Widgets HINTS ${QT5_BREW_PATH})

link_directories(${Boost_LIBRARY_DIRS})
include_directories(${Boost_INCLUDE_DIRS})

add_executable(foo main.cpp)
target_link_libraries(foo
  PRIVATE ${Boost_LIBRARIES}
  PRIVATE Qt5::Widgets
  )

我配置并构建了一个虚拟可执行文件。您可以清楚地看到编译行上的-std=c++1z-std=gnu++11

❯ make VERBOSE=1
/usr/local/Cellar/cmake/3.7.2/bin/cmake -H/Users/nega/foo -B/Users/nega/foo --check-build-system CMakeFiles/Makefile.cmake 0
/usr/local/Cellar/cmake/3.7.2/bin/cmake -E cmake_progress_start /Users/nega/foo/CMakeFiles /Users/nega/foo/CMakeFiles/progress.marks
/Applications/Xcode.app/Contents/Developer/usr/bin/make -f CMakeFiles/Makefile2 all
/Applications/Xcode.app/Contents/Developer/usr/bin/make -f CMakeFiles/foo.dir/build.make CMakeFiles/foo.dir/depend
cd /Users/nega/foo && /usr/local/Cellar/cmake/3.7.2/bin/cmake -E cmake_depends "Unix Makefiles" /Users/nega/foo /Users/nega/foo /Users/nega/foo /Users/nega/foo /Users/nega/foo/CMakeFiles/foo.dir/DependInfo.cmake --color=
/Applications/Xcode.app/Contents/Developer/usr/bin/make -f CMakeFiles/foo.dir/build.make CMakeFiles/foo.dir/build
[ 50%] Building CXX object CMakeFiles/foo.dir/main.cpp.o
/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/c++   -DQT_CORE_LIB -DQT_GUI_LIB -DQT_NO_DEBUG -DQT_WIDGETS_LIB -I/usr/local/opt/boost@1.55/include -iframework /usr/local/opt/qt5/lib -isystem /usr/local/opt/qt5/lib/QtWidgets.framework/Headers -isystem /usr/local/opt/qt5/lib/QtGui.framework/Headers -isystem /System/Library/Frameworks/OpenGL.framework/Headers -isystem /usr/local/opt/qt5/lib/QtCore.framework/Headers -isystem /usr/local/opt/qt5/./mkspecs/macx-clang  -std=c++1z   -fPIC -std=gnu++11 -o CMakeFiles/foo.dir/main.cpp.o -c /Users/nega/foo/main.cpp
[100%] Linking CXX executable foo
/usr/local/Cellar/cmake/3.7.2/bin/cmake -E cmake_link_script CMakeFiles/foo.dir/link.txt --verbose=1
/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/c++    -std=c++1z -Wl,-search_paths_first -Wl,-headerpad_max_install_names  CMakeFiles/foo.dir/main.cpp.o  -o foo  -L/usr/local/opt/boost@1.55/lib -Wl,-rpath,/usr/local/opt/boost@1.55/lib /usr/local/opt/boost@1.55/lib/libboost_serialization-mt.dylib /usr/local/opt/boost@1.55/lib/libboost_system-mt.dylib /usr/local/opt/qt5/lib/QtWidgets.framework/QtWidgets /usr/local/opt/qt5/lib/QtGui.framework/QtGui /usr/local/opt/qt5/lib/QtCore.framework/QtCore 
[100%] Built target foo
/usr/local/Cellar/cmake/3.7.2/bin/cmake -E cmake_progress_start /Users/nega/foo/CMakeFiles 0

如果您在CMakeLists.txt中注释掉Qt5的使用情况并再次进行配置和构建,您会看到-std=gnu++11消失(以及Qt也在添加的-fPIC)。

<强>的CMakeLists.txt:

cmake_minimum_required(VERSION 3.7.2 FATAL_ERROR)

set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++1z")
set(BOOST_ROOT "/usr/local/opt/boost@1.55")
execute_process(COMMAND brew --prefix qt5
  COMMAND tr -d \\n
  OUTPUT_VARIABLE QT5_BREW_PATH)

find_package(Boost COMPONENTS serialization system)
#find_package(Qt5 COMPONENTS Widgets HINTS ${QT5_BREW_PATH})

link_directories(${Boost_LIBRARY_DIRS})
include_directories(${Boost_INCLUDE_DIRS})

add_executable(foo main.cpp)
target_link_libraries(foo
  PRIVATE ${Boost_LIBRARIES}
# PRIVATE Qt5::Widgets
  )

make输出(删节):

[...]
[ 50%] Building CXX object CMakeFiles/foo.dir/main.cpp.o
/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/c++    -I/usr/local/opt/boost@1.55/include  -std=c++1z   -o CMakeFiles/foo.dir/main.cpp.o -c /Users/nega/foo/main.cpp
[100%] Linking CXX executable foo
/usr/local/Cellar/cmake/3.7.2/bin/cmake -E cmake_link_script CMakeFiles/foo.dir/link.txt --verbose=1
/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/c++    -std=c++1z -Wl,-search_paths_first -Wl,-headerpad_max_install_names  CMakeFiles/foo.dir/main.cpp.o  -o foo  -L/usr/local/opt/boost@1.55/lib -Wl,-rpath,/usr/local/opt/boost@1.55/lib /usr/local/opt/boost@1.55/lib/libboost_serialization-mt.dylib /usr/local/opt/boost@1.55/lib/libboost_system-mt.dylib 
[100%] Built target foo
[...]

不幸的是,经过一些简短的挖掘后,我无法看到Qt在其-std=gnu++11文件中设置*Config.cmake的位置。必须进入CMake,而不仅仅是grep可以找到的{CM}。也许通过cmake --trace阅读将提供一些见解。

奇怪的是,它所做的一切都尊重CXX_STANDARD。如果我们调整原始CMakeLists.txt并再次配置和构建:

CMakeLists.txt(删节):

cmake_minimum_required(VERSION 3.7.2 FATAL_ERROR)

set(CMAKE_CXX_STANDARD 14)
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++1z")
set(BOOST_ROOT "/usr/local/opt/boost@1.55")
execute_process(COMMAND brew --prefix qt5
[...]

make输出(删节):

[...]
[ 50%] Building CXX object CMakeFiles/foo.dir/main.cpp.o
/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/c++   -DQT_CORE_LIB -DQT_GUI_LIB -DQT_NO_DEBUG -DQT_WIDGETS_LIB -I/usr/local/opt/boost@1.55/include -iframework /usr/local/opt/qt5/lib -isystem /usr/local/opt/qt5/lib/QtWidgets.framework/Headers -isystem /usr/local/opt/qt5/lib/QtGui.framework/Headers -isystem /System/Library/Frameworks/OpenGL.framework/Headers -isystem /usr/local/opt/qt5/lib/QtCore.framework/Headers -isystem /usr/local/opt/qt5/./mkspecs/macx-clang  -std=c++1z   -fPIC -std=gnu++14 -o CMakeFiles/foo.dir/main.cpp.o -c /Users/nega/foo/main.cpp
[100%] Linking CXX executable foo
/usr/local/Cellar/cmake/3.7.2/bin/cmake -E cmake_link_script CMakeFiles/foo.dir/link.txt --verbose=1
/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/c++    -std=c++1z -Wl,-search_paths_first -Wl,-headerpad_max_install_names  CMakeFiles/foo.dir/main.cpp.o  -o foo  -L/usr/local/opt/boost@1.55/lib -Wl,-rpath,/usr/local/opt/boost@1.55/lib /usr/local/opt/boost@1.55/lib/libboost_serialization-mt.dylib /usr/local/opt/boost@1.55/lib/libboost_system-mt.dylib /usr/local/opt/qt5/lib/QtWidgets.framework/QtWidgets /usr/local/opt/qt5/lib/QtGui.framework/QtGui /usr/local/opt/qt5/lib/QtCore.framework/QtCore 
[100%] Built target foo
[...]

您可以看到(Qt已添加)-fPIC -std=gnu++11现在为-fPIC -std=gnu++14。不幸的是,在CMake 3.8.0发布及其CXX_STANDARD / CMAKE_CXX_STANDARD will understand "C++17"之前,这对您无济于事。