2017-02-20 5 views
1

cmake 3.7を使用してLinux上でC++実行可能ファイルをビルドする場合、フラグをコンパイルするためにフラグ-std=gnu++11が追加されています。問題は、すでに手動で-std=c++1zフラグを追加しています。この新しいフラグは私のものを上書きします。これは、実行可能ファイルに対してのみ発生しますが、私はこれがドキュメントに記載されていることはわかりません。 CMAKE_CXX_STANDARDは空です。ターゲットにCXX_STANDARDプロパティを設定しても効果はありません。このフラグを削除する方法はありますか?cmake:不要な場合にC++標準を追加する

これは実行可能ファイルに限られているとは限りません。

は、ここに私の(簡体字)cmakeのです:疑わ@florianとして

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

、それはあなたのコンパイルコマンドを汚染だと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 
) 

私はダミーの実行可能ファイルを設定してビルドしました。あなたが私たちのCMakeLists.txtにQt5の使用状況をコメントアウトして設定して、再度ビルドする場合はどの-fPICと一緒に(あなたは-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 

:あなたははっきりコンパイル行上-std=c++1z-std=gnu++11を見ることができます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"になるまで、これはあなたを助けません。

関連する問題