如何在CMake文件中添加鏈接器或編譯標志?我正在使用arm-linux-androideabi-g++編譯器。當我嘗試編譯一個簡單的“你好,世界!” 程序編譯好。當我通過在該代碼中添加一個簡單的異常處理來測試它時它也可以工作(添加之后-fexceptions..我猜它默認是禁用的)。這適用于Android設備,我只想使用CMake,而不是ndk-build。例如 - first.cpp#include <iostream>using namespace std;int main(){
try{
}
catch(...)
{
}
return 0;}./arm-linux-androideadi-g++ -o first-test first.cpp -fexceptions它沒有問題......問題 ...我試圖用CMake文件編譯文件。我想添加-fexceptions標志。我試過了set (CMAKE_EXE_LINKER_FLAGS -fexceptions ) or set (CMAKE_EXE_LINKER_FLAGS "fexceptions" )和set ( CMAKE_C_FLAGS "fexceptions")它仍然顯示錯誤。
3 回答

尚方寶劍之說
TA貢獻1788條經驗 獲得超4個贊
假設您要添加這些標志(最好將它們聲明為常量):
SET(GCC_COVERAGE_COMPILE_FLAGS "-fprofile-arcs -ftest-coverage")SET(GCC_COVERAGE_LINK_FLAGS "-lgcov")
有幾種方法可以添加它們:
最簡單的(不干凈,但簡單方便,只適用于編譯標志,C&C ++一次):
add_definitions(${GCC_COVERAGE_COMPILE_FLAGS})
附加到相應的CMake變量:
SET(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} ${GCC_COVERAGE_COMPILE_FLAGS}")SET(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} ${GCC_COVERAGE_LINK_FLAGS}")
使用目標屬性,參見 doc CMake編譯標志目標屬性,需要知道目標名稱。
get_target_property(TEMP ${THE_TARGET} COMPILE_FLAGS)if(TEMP STREQUAL "TEMP-NOTFOUND") SET(TEMP "") # Set to empty stringelse() SET(TEMP "${TEMP} ") # A space to cleanly separate from existing contentendif()# Append our valuesSET(TEMP "${TEMP}${GCC_COVERAGE_COMPILE_FLAGS}" )set_target_properties(${THE_TARGET} PROPERTIES COMPILE_FLAGS ${TEMP} )
現在我使用方法2。

三國紛爭
TA貢獻1804條經驗 獲得超7個贊
在較新版本的CMake中,您可以分別使用target_compile_options
和設置單個目標的編譯器和鏈接器標志target_link_libraries
(是的,后者也設置鏈接器選項):
target_compile_options(first-test PRIVATE -fexceptions)
這種方法的優點是你可以控制選項傳播到依賴于這個PUBLIC
和/的其他目標PRIVATE
。
從CMake 3.13開始,您還可以使用target_link_options
添加鏈接器選項,使意圖更清晰。

婷婷同學_
TA貢獻1844條經驗 獲得超8個贊
嘗試設置變量CMAKE_CXX_FLAGS
而不是CMAKE_C_FLAGS
:
set (CMAKE_CXX_FLAGS "-fexceptions")
該變量CMAKE_C_FLAGS
僅影響C編譯器,但您正在編譯C ++代碼。
添加標志CMAKE_EXE_LINKER_FLAGS
是多余的。
添加回答
舉報
0/150
提交
取消