我有一個在 Linux 和 Windows 上編譯的 C CMake 專案。在 Windows 上,這是通過 Visual Studio/MSVCC 完成的。
在 CMAKE 和 VS 中,構建設定為除錯,但似乎在 VS 構建中沒有生成任何除錯符號 - 所以除錯是不可能的。
在查看 VS 的詳細輸出時,我看到了這個:
cl : command line warning D9002: ignoring unknown option '-g'
這表明它-g
不像 GCC/Clang 那樣識別標志。
這是 CMake 引數:
SET(CMAKE_CXX_STANDARD 17)
SET(CMAKE_CXX_STANDARD_REQUIRED ON)
SET(BUILD_MODE Debug)
SET(CMAKE_CXX_FLAGS "-Wall")
SET(CMAKE_CXX_FLAGS_DEBUG "-g")
SET(CMAKE_CXX_FLAGS_RELEASE "-O3")
如何使它與 Visual Studio 兼容?我試過到處找,但大多數相關的帖子似乎都是關于 C#/.net 或更舊版本的 VS。
如果這很重要,該專案確實使用 QT 庫。
更新:
事實證明,BUILD_MODE 是其他人添加的,因此每個子專案不需要單獨設定為發布或除錯,我們只需在根級 Cmakelists 中設定一次。他們確實都CMAKE_BUILD_TYPE
按預期使用了。
此外,這里的答案是正確的。直接設定 CMAKE_CXX_FLAGS 會消除默認值,導致 Debug 版本在 MSVCC 中沒有 /Zi 之類的選項,從而阻止了除錯符號和所有除錯。它還引入了一個 MSVCC 無法識別的無法識別標志“-g”。
我從專案中的每個 Cmakelists.txt 中完全洗掉了 SET_CXX_FLAGS,一切正常。
如果我需要添加它們,我將按照建議使用 _INIT 選項。
uj5u.com熱心網友回復:
您必須使用設定的不同模式進行編譯,CMAKE_BUILD_TYPE
如
cmake -DCMAKE_BUILD_TYPE=DEBUG <sourcedir>
您永遠不會直接設定這些標志。如果要向除錯模式添加新標志,例如堆疊保護器,則應使用*_INIT
變數。
您可以使用和cmake 布爾預定義常量進一步區分您正在運行的作業系統UNIX
:WIN32
MSVC
if ( UNIX )
set( CMAKE_CXX_FLAGS_DEBUG_INIT "-fstack-protector" )
elseif( WIN32 )
set( CMAKE_CXX_FLAGS_DEBUG_INIT "/GS" )
endif()
uj5u.com熱心網友回復:
不需要在 cmake 中明確定義-O3
和明確。-g
如您所見,設定這些可能會阻止代碼與其他編譯器一起使用。無論如何,這兩個選項都是默認選項。
要使用 unix makefile 構建配置之一,您只需CMAKE_BUILD_TYPE
在配置期間設定快取變數:
(我假設提到的生成器是下面的默認生成器。)
cmake -D CMAKE_BUILD_TYPE=Debug -S ... -B buildDir
或者
cmake -D CMAKE_BUILD_TYPE=Debug -S ... -B buildDir
并構建您使用的專案
cmake --build buildDir
視覺作業室是不同的,因為生成的專案一次涵蓋了所有配置。您可以在構建(或安裝)專案時指定要使用的配置:
cmake -A x64 -S ... -B buildDir
cmake --build buildDir --config Release
cmake --build buildDir --config Debug
或者,您可以簡單地在 IDE 中打開生成的解決方案。
cmake --open buildDir
對于編譯器特定的標志,您可能需要區分大小寫:
if(CMAKE_CXX_COMPILER_ID STREQUAL "MSVC")
add_compile_options(/Wall)
elseif(CMAKE_CXX_COMPILER_ID STREQUAL "GNU")
add_compile_options(-Wall)
endif()
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/505097.html