本文使用的相關(guān)軟件環(huán)境信息如下:
軟件名稱 | 軟件版本 |
---|---|
Linux操作系統(tǒng) | Ubuntu 22.04 LTS(X64) |
cmake | 3.22.1 |
g++ | 11.4.0 |
-
target_compile_options
命令格式:
target_compile_options(<target> [BEFORE] <INTERFACE|PUBLIC|PRIVATE> [items1...] [<INTERFACE|PUBLIC|PRIVATE> [items2...] ...])
該命令添加編譯選項(xiàng)到編譯目標(biāo)中太惠,與add_compile_options不同的是吗购,target_compile_options針對(duì)構(gòu)建的目標(biāo)添加編譯選項(xiàng)旷坦,而add_compile_options是針對(duì)源文件添加預(yù)編譯選項(xiàng)(實(shí)際上也隱含對(duì)當(dāng)前構(gòu)建目標(biāo)添加編譯選項(xiàng))庸诱。
因此,target_compile_options要求構(gòu)建目標(biāo)已經(jīng)存在粗卜,也就是被add_executable()或add_library()等函數(shù)創(chuàng)建出來(lái)屋确。此外,target_compile_options還要求對(duì)每一個(gè)編譯選項(xiàng)指定范圍休建,范圍有三個(gè)選項(xiàng):PUBLIC、PRIVATE和INTERFACE评疗。通過PUBLIC和PRIVATE范圍限定的預(yù)編譯選項(xiàng)會(huì)被添加到構(gòu)建目標(biāo)的COMPILE_OPTIONS屬性中测砂,通過PUBLIC和INTERFACE范圍限定的預(yù)編譯選項(xiàng)會(huì)被添加到構(gòu)建目標(biāo)的INTERFACE_COMPILE_OPTIONS屬性中“俅遥總結(jié)起來(lái)就是PUBLIC既給自己用砌些,也給別人用;PRIVATE只給自己用加匈;INTERFACE只給別人用存璃。
當(dāng)多個(gè)構(gòu)建目標(biāo)在一起鏈接的時(shí),最終的可執(zhí)行文件會(huì)將各個(gè)構(gòu)建目標(biāo)的INTERFACE_COMPILE_OPTIONS屬性繼承過來(lái)雕拼。
總體來(lái)說(shuō)纵东,target_compile_options與add_compile_options的關(guān)系,和add_compile_definitions與target_compile_definitions的關(guān)系類似啥寇。下面通過一個(gè)例子來(lái)演示一下:
1偎球、構(gòu)建一個(gè)test庫(kù),對(duì)test使用PUBLIC辑甜、PRIVATE和INTERFACE三個(gè)編譯選項(xiàng)衰絮,分別對(duì)應(yīng)編譯選項(xiàng)-Wunused-variable(未使用的變量)、-Wreturn-type(函數(shù)缺少返回值)磷醋、-Wuninitialized(變量使用前未初始化)猫牡;
2、構(gòu)建一個(gè)main可執(zhí)行文件邓线,對(duì)main使用PRIVATE的編譯選項(xiàng)-Wunused-parameter(從未使用過的函數(shù)參數(shù))淌友;
3、對(duì)test.cpp和main.cpp都模擬未使用的變量骇陈、函數(shù)缺少返回值亩进、變量使用前未初始化、從未使用過的函數(shù)參數(shù)這4種情況缩歪。
CMakeLists.txt文件內(nèi)容:
CMAKE_MINIMUM_REQUIRED(VERSION 3.22) PROJECT(compile_options_test) ADD_LIBRARY(test test.cpp) TARGET_COMPILE_OPTIONS(test PUBLIC -Wunused-variable PRIVATE -Wreturn-type INTERFACE -Wuninitialized) ADD_EXECUTABLE(main main.cpp) TARGET_COMPILE_OPTIONS(main PRIVATE -Wunused-parameter) TARGET_LINK_LIBRARIES(main test)
test.h文件內(nèi)容
#ifndef __TEST_TT__ #define __TEST_TT__ int test(int para); #endif
test.cpp文件內(nèi)容:
#include "test.h" int test(int para/* 未使用的函數(shù)參數(shù) */) { int a = 5; // 未使用的變量 int i; // 未初始化的變量 if (i == 0) { } // 函數(shù)缺少返回值 }
main.cpp文件內(nèi)容:
#include "test.h" int main(int argc, char** argv /* 未使用的函數(shù)參數(shù) */) { const char* not_use_var = "Hello world!"; // 未使用的變量 int i; // 未初始化的變量 test(i); //return 0; // 函數(shù)缺少返回值 }
運(yùn)行
cmake .
和make VERBOSE=1
归薛,關(guān)鍵信息輸出如下:…… [ 25%] Building CXX object CMakeFiles/test.dir/test.cpp.o /usr/bin/c++ -Wunused-variable -Wreturn-type -MD -MT CMakeFiles/test.dir/test.cpp.o -MF CMakeFiles/test.dir/test.cpp.o.d -o CMakeFiles/test.dir/test.cpp.o -c /XXX/test.cpp /XXX/test.cpp: In function ‘int test(int)’: /XXX/test.cpp:5:9: warning: unused variable ‘a(chǎn)’ [-Wunused-variable] 5 | int a = 5; // 未使用的變量 | ^ /XXX/test.cpp:11:1: warning: no return statement in function returning non-void [-Wreturn-type] 11 | } | ^ [ 50%] Linking CXX static library libtest.a …… [ 75%] Building CXX object CMakeFiles/main.dir/main.cpp.o /usr/bin/c++ -Wunused-parameter -Wunused-variable -Wuninitialized -MD -MT CMakeFiles/main.dir/main.cpp.o -MF CMakeFiles/main.dir/main.cpp.o.d -o CMakeFiles/main.dir/main.cpp.o -c /XXX/main.cpp /XXX/main.cpp: In function ‘int main(int, char**)’: /XXX/main.cpp:5:17: warning: unused variable ‘not_use_var’ [-Wunused-variable] 5 | const char* not_use_var = "Hello world!"; // 未使用的變量 | ^~~~~~~~~~~ /XXX/main.cpp:3:14: warning: unused parameter ‘a(chǎn)rgc’ [-Wunused-parameter] 3 | int main(int argc, char** argv /* 未使用的函數(shù)參數(shù) */) | ~~~~^~~~ /XXX/main.cpp:3:27: warning: unused parameter ‘a(chǎn)rgv’ [-Wunused-parameter] 3 | int main(int argc, char** argv /* 未使用的函數(shù)參數(shù) */) | ~~~~~~~^~~~ /XXX/main.cpp:7:9: warning: ‘i’ is used uninitialized [-Wuninitialized] 7 | test(i); | ~~~~^~~ [100%] Linking CXX executable main
可以看到,對(duì)于test庫(kù),其PUBLIC和PRIVATE編譯選項(xiàng)生效主籍,2種告警提示习贫;對(duì)于main可執(zhí)行文件,繼承了test庫(kù)的PUBLIC和INTERFACE編譯選項(xiàng)千元,加上自身的PRIVATE編譯選項(xiàng)苫昌,3種告警提示。