2017-02-20 86 views
1

在Linux下使用cmake 3.7构建C++可执行文件时,我看到要添加一个-std=gnu++11标志来编译标志。问题是,我已经手动添加一个-std=c++1z标志,并且这个新标志覆盖了我的标志。这只发生在可执行文件中,但我无法在文档中找到它。 CMAKE_CXX_STANDARD为空,并且在目标上设置CXX_STANDARD属性不起作用。有没有办法去除这个标志?cmake:不需要时添加C++标准

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

这是我(简化)的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 
) 
+0

赞同[this](http://stackoverflow.com/questions/38053846/replace-fpic-with-fpic)问题我假设Qt5或Boost带来了这个选项。那么你用'get_target_property(_flags $ {PROFILER_CLIENT_NAME} INTERFACE_COMPILE_OPTIONS)'和'message(“_ flags = $ {_ flags}”)''得到了什么? – Florian

回答

0

由于@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/[email protected]") 
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/[email protected]/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/[email protected]/lib -Wl,-rpath,/usr/local/opt/[email protected]/lib /usr/local/opt/[email protected]/lib/libboost_serialization-mt.dylib /usr/local/opt/[email protected]/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消失(与-fPIC沿Qt也在增加)。

的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/[email protected]") 
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/[email protected]/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/[email protected]/lib -Wl,-rpath,/usr/local/opt/[email protected]/lib /usr/local/opt/[email protected]/lib/libboost_serialization-mt.dylib /usr/local/opt/[email protected]/lib/libboost_system-mt.dylib 
[100%] Built target foo 
[...] 

不幸的是,一些简单的挖我看不出哪里后的Qt在设置-std=gnu++11*Config.cmake文件。它必须达到CMake以上的几个grep的能找到的。也许通过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/[email protected]") 
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/[email protected]/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/[email protected]/lib -Wl,-rpath,/usr/local/opt/[email protected]/lib /usr/local/opt/[email protected]/lib/libboost_serialization-mt.dylib /usr/local/opt/[email protected]/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_STANDARDwill understand "C++17"才会对你有所帮助。