CMake編譯命令target_compile_definitions簡(jiǎn)介

本文使用的相關(guān)軟件環(huán)境信息如下:

軟件名稱 軟件版本
Linux操作系統(tǒng) Ubuntu 22.04 LTS(X64)
cmake 3.22.1
g++ 11.4.0
  • target_compile_definitions

    命令格式

    target_compile_definitions(<target>
      <INTERFACE|PUBLIC|PRIVATE> [items1...]
      [<INTERFACE|PUBLIC|PRIVATE> [items2...] ...])
    

    該命令添加預(yù)編譯選項(xiàng)到編譯目標(biāo)中,與add_compile_definitions不同的是,target_compile_definitions針對(duì)構(gòu)建的目標(biāo)添加預(yù)編譯選項(xiàng)驶臊,而add_compile_definitions是針對(duì)源文件添加預(yù)編譯選項(xiàng)(實(shí)際上也隱含對(duì)當(dāng)前構(gòu)建目標(biāo)添加預(yù)編譯選項(xiàng))。

    因此匿垄,target_compile_definitions要求構(gòu)建目標(biāo)已經(jīng)存在,也就是被add_executable()或add_library()等函數(shù)創(chuàng)建出來。此外验懊,target_compile_definitions還要求對(duì)每一個(gè)編譯選項(xiàng)指定范圍吭服,范圍有三個(gè)選項(xiàng):PUBLIC嚷堡、PRIVATE和INTERFACE。通過PUBLIC和PRIVATE范圍限定的預(yù)編譯選項(xiàng)會(huì)被添加到構(gòu)建目標(biāo)的COMPILE_DEFINITIONS屬性中艇棕,通過PUBLIC和INTERFACE范圍限定的預(yù)編譯選項(xiàng)會(huì)被添加到構(gòu)建目標(biāo)的INTERFACE_COMPILE_DEFINITIONS屬性中蝌戒。總結(jié)起來就是PUBLIC既給自己用欠肾,也給別人用瓶颠;PRIVATE只給自己用;INTERFACE只給別人用刺桃。

    當(dāng)多個(gè)構(gòu)建目標(biāo)在一起鏈接的時(shí)粹淋,最終的可執(zhí)行文件會(huì)將各個(gè)構(gòu)建目標(biāo)的INTERFACE_COMPILE_DEFINITIONS屬性繼承過來。

    對(duì)于-D的前導(dǎo)符和空字符串""會(huì)被CMake忽略瑟慈,例如下面命令完全等價(jià):

    target_compile_definitions(target PUBLIC DEF_FLAG)
    target_compile_definitions(target PUBLIC -DDEF_FLAG)  # -D 被移除
    target_compile_definitions(target PUBLIC "" DEF_FLAG) # "" 被忽略
    target_compile_definitions(target PUBLIC -D DEF_FLAG) # -D 變成 "" 然后被忽略
    

    下面來看一個(gè)示例:

    1桃移、對(duì)于CMakeLists.txt,通過構(gòu)建一個(gè)test庫和一個(gè)可執(zhí)行文件main葛碧,對(duì)test庫添加3個(gè)編譯選項(xiàng):一個(gè)是范圍為PRIVATE的PRIVATE_PRINT借杰,一個(gè)是范圍為PUBLIC的PUBLIC_PRINT,一個(gè)范圍是INTERFACE的INTERFACE_TEST_DEF进泼;對(duì)main可執(zhí)行文件添加范圍為PUBLIC的DEBUG_PRINT蔗衡。

    2、對(duì)于源文件:test.cpp在定義PRIVATE_PRINT宏時(shí)會(huì)打印一條"show test private print..."乳绕,在定義PUBLIC_PRINT宏時(shí)候绞惦,會(huì)實(shí)現(xiàn)一個(gè)接口test_print()主胧,該接口打印一條"show test public print..."遏弱,該接口會(huì)在main.cpp中被調(diào)用(也會(huì)判斷宏定義PUBLIC_PRINT),而main.cpp在定義DEBUG_PRINT宏時(shí)會(huì)打印一條"In debug print mode..."肺然,在定義PRIVATE_PRINT宏時(shí)會(huì)打印"show test private print in main..."菠发。

    文件目錄結(jié)構(gòu)為:

    ├── CMakeLists.txt
    ├── main.cpp
    ├── test.cpp
    └── test.h
    

    CMakeLists.txt文件內(nèi)容:

    CMAKE_MINIMUM_REQUIRED(VERSION 3.22)
    PROJECT(compiler_options)
    
    ADD_LIBRARY(test test.cpp)
    # 為test增加預(yù)編譯選項(xiàng)
    TARGET_COMPILE_DEFINITIONS(test
                                PRIVATE PRIVATE_PRINT
                                PUBLIC PUBLIC_PRINT
                                INTERFACE INTERFACE_TEST_DEF)
    
    ADD_EXECUTABLE(main main.cpp)
    TARGET_COMPILE_DEFINITIONS(main PUBLIC DEBUG_PRINT)
    
    TARGET_LINK_LIBRARIES(main test)
    

    test.h文件內(nèi)容:

    #ifndef __TEST_TT__
    #define __TEST_TT__
    
    #ifdef PUBLIC_PRINT
    void test_print();
    #endif
    
    #endif
    

    test.cpp內(nèi)容:

    #ifdef PUBLIC_PRINT
    #include "test.h"
    #include <iostream>
    void test_print()
    {
        std::cout << "test:show test public print..." << std::endl;
    #ifdef PRIVATE_PRINT
        std::cout << "test:show test private print..." << std::endl;
    #endif
    }
    #endif
    

    main.cpp內(nèi)容:

    #include "test.h"
    #include <iostream>
    
    int main(int argc, char** argv)
    {
    #ifdef DEBUG_PRINT
        std::cout << "main:In debug print mode..." << std::endl;
    #endif
    
    #ifdef PUBLIC_PRINT
        test_print();
    #endif
    
    #ifdef PRIVATE_PRINT
        std::cout << "main:show test private print in main..." << std::endl;
    #endif
        return 0;
    }
    

    運(yùn)行cmake .make VERBOSE=1王滤,關(guān)鍵信息輸出如下:

    ……
    [ 25%] Building CXX object CMakeFiles/test.dir/test.cpp.o
    /usr/bin/c++ -DPRIVATE_PRINT -DPUBLIC_PRINT   -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
    [ 50%] Linking CXX static library libtest.a
    ……
    [ 75%] Building CXX object CMakeFiles/main.dir/main.cpp.o
    /usr/bin/c++ -DDEBUG_PRINT -DINTERFACE_TEST_DEF -DPUBLIC_PRINT   -MD -MT CMakeFiles/main.dir/main.cpp.o -MF CMakeFiles/main.dir/main.cpp.o.d -o CMakeFiles/main.dir/main.cpp.o -c /home/shengyi/code/gitee_repo/projects/cmake/target_compile_definitions/main.cpp
    [100%] Linking CXX executable main
    

    可以看到,在編譯test庫時(shí)滓鸠,使用了-DPRIVATE_PRINT -DPUBLIC_PRINT雁乡,說明INTERFACE預(yù)編譯選項(xiàng)test庫本身并不使用;在編譯main可執(zhí)行文件時(shí)候糜俗,使用了-DDEBUG_PRINT -DINTERFACE_TEST_DEF -DPUBLIC_PRINT 蔗怠,說明test庫的PUBLIC和INTERFACE預(yù)編譯選項(xiàng)傳遞給了main墩弯。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市寞射,隨后出現(xiàn)的幾起案子渔工,更是在濱河造成了極大的恐慌,老刑警劉巖桥温,帶你破解...
    沈念sama閱讀 221,888評(píng)論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件引矩,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡侵浸,警方通過查閱死者的電腦和手機(jī)旺韭,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,677評(píng)論 3 399
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來掏觉,“玉大人区端,你說我怎么就攤上這事“母梗” “怎么了织盼?”我有些...
    開封第一講書人閱讀 168,386評(píng)論 0 360
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)酱塔。 經(jīng)常有香客問我沥邻,道長(zhǎng),這世上最難降的妖魔是什么羊娃? 我笑而不...
    開封第一講書人閱讀 59,726評(píng)論 1 297
  • 正文 為了忘掉前任唐全,我火速辦了婚禮,結(jié)果婚禮上蕊玷,老公的妹妹穿的比我還像新娘邮利。我一直安慰自己,他們只是感情好垃帅,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,729評(píng)論 6 397
  • 文/花漫 我一把揭開白布延届。 她就那樣靜靜地躺著,像睡著了一般挺智。 火紅的嫁衣襯著肌膚如雪祷愉。 梳的紋絲不亂的頭發(fā)上窗宦,一...
    開封第一講書人閱讀 52,337評(píng)論 1 310
  • 那天赦颇,我揣著相機(jī)與錄音,去河邊找鬼赴涵。 笑死媒怯,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的髓窜。 我是一名探鬼主播扇苞,決...
    沈念sama閱讀 40,902評(píng)論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼欺殿,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來了鳖敷?” 一聲冷哼從身側(cè)響起脖苏,我...
    開封第一講書人閱讀 39,807評(píng)論 0 276
  • 序言:老撾萬榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎定踱,沒想到半個(gè)月后棍潘,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 46,349評(píng)論 1 318
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡崖媚,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,439評(píng)論 3 340
  • 正文 我和宋清朗相戀三年亦歉,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片畅哑。...
    茶點(diǎn)故事閱讀 40,567評(píng)論 1 352
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡肴楷,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出荠呐,到底是詐尸還是另有隱情赛蔫,我是刑警寧澤,帶...
    沈念sama閱讀 36,242評(píng)論 5 350
  • 正文 年R本政府宣布直秆,位于F島的核電站濒募,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏圾结。R本人自食惡果不足惜瑰剃,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,933評(píng)論 3 334
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望筝野。 院中可真熱鬧晌姚,春花似錦、人聲如沸歇竟。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,420評(píng)論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽焕议。三九已至宝磨,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間盅安,已是汗流浹背唤锉。 一陣腳步聲響...
    開封第一講書人閱讀 33,531評(píng)論 1 272
  • 我被黑心中介騙來泰國(guó)打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留别瞭,地道東北人窿祥。 一個(gè)月前我還...
    沈念sama閱讀 48,995評(píng)論 3 377
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像蝙寨,于是被迫代替她去往敵國(guó)和親晒衩。 傳聞我的和親對(duì)象是個(gè)殘疾皇子嗤瞎,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,585評(píng)論 2 359

推薦閱讀更多精彩內(nèi)容