在线看毛片网站电影-亚洲国产欧美日韩精品一区二区三区,国产欧美乱夫不卡无乱码,国产精品欧美久久久天天影视,精品一区二区三区视频在线观看,亚洲国产精品人成乱码天天看,日韩久久久一区,91精品国产91免费

<menu id="6qfwx"><li id="6qfwx"></li></menu>
    1. <menu id="6qfwx"><dl id="6qfwx"></dl></menu>

      <label id="6qfwx"><ol id="6qfwx"></ol></label><menu id="6qfwx"></menu><object id="6qfwx"><strike id="6qfwx"><noscript id="6qfwx"></noscript></strike></object>
        1. <center id="6qfwx"><dl id="6qfwx"></dl></center>

            博客專欄

            EEPW首頁 > 博客 > CMake獲取當(dāng)前目錄名以及獲取上層目錄名

            CMake獲取當(dāng)前目錄名以及獲取上層目錄名

            發(fā)布人:電子禪石 時間:2024-01-26 來源:工程師 發(fā)布文章

            CMake中有兩個變量,可以獲取到當(dāng)前CMakeLists.txt的當(dāng)前目錄名(絕對路徑)

            和當(dāng)前文件的絕對路徑,

            分別是CMAKE_CURRENT_SOURCE_DIR和CMAKE_CURRENT_LIST_FILE。


            但是,有時候需要的往往是相對路徑名。比如我們編寫項目的一些樣例,

            以當(dāng)前文件夾的名字作為target名,同時還需要把生成的target按照上層目錄名來分組,

            例如下列目錄結(jié)構(gòu):

            ————————————————


            examples
            	|- base
            		|- string
            			|- CMakeLists.txt
            			|- base.h
            			|- base.cpp
            			|- main.cpp
            		|- core
            			|- CMakeLists.txt
            			|- main.cpp
            	|- network
            		|- tcp
            			|- CMakeLists.txt
            			|- main.cpp

            這個項目需要生成Visual Studio項目,CMakeLists.txt如下所示:

            # remove last end of "/"
            string(REGEX REPLACE "/$" "" CURRENT_FOLDER_ABSOLUTE ${CMAKE_CURRENT_SOURCE_DIR})
            
            # get current relative dir name and set target name
            string(REGEX REPLACE ".*/(.*)" "\\1" CURRENT_FOLDER ${CURRENT_FOLDER_ABSOLUTE})
            set (TARGET_NAME ${CURRENT_FOLDER})
            
            # init target
            add_executable (${TARGET_NAME} ${ARGN})
            target_include_directories (${TARGET_NAME} ${CMAKE_CURRENT_SOURCE_DIR})
            
            # get above dir name and set target group name
            get_filename_component(SECOND_FOLDER_ABSOLUTE ${CURRENT_FOLDER_ABSOLUTE} DIRECTORY)
            string(REGEX REPLACE ".*/(.*)" "\\1" SECOND_FOLDER ${SECOND_FOLDER_ABSOLUTE})
            
            # group target
            set_target_properties (${TARGET_NAME} PROPERTIES FOLDER "examples/${SECOND_FOLDER}")

            生成后的項目如圖所示,這里借用一個項目結(jié)構(gòu)相同的項目來展示。




            進入正題,獲取相對路徑的目錄名有兩種方式:

            • 利用字符串正則表達式替換

            • string(REGEX REPLACE <regular_expression>
                     <replacement_expression> <output_variable>
                     <input> [<input>...])

            • 利用命令get_filename_component

            • 不管哪種,都要先去掉絕對路徑后面的/。

            • 正則表達式

            • string(REGEX REPLACE ".*/(.*)" "\\1" CURRENT_FOLDER
            • ${CURRENT_FOLDER_ABSOLUTE})

            使用括號來保存子表達式的匹配結(jié)果,子表達式匹配的就是相對路徑的目錄名。
            這種用法可以參考google protobuf的寫法。
            獲取上層目錄也是簡單的,只需要使用正則表達式替換掉當(dāng)前目錄名,
            然后再執(zhí)行一次獲取當(dāng)前目錄名即可。

            string(REGEX REPLACE "(.*)/${CURRENT_FOLDER}$" "\\1" SECOND_FOLDER_ABSOLUTE ${CURRENT_FOLDER_ABSOLUTE})
            string(REGEX REPLACE ".*/(.*)" "\\1" SECOND_FOLDER ${SECOND_FOLDER_ABSOLUTE})


                

            這里要清楚正則表達式之中的括號子表達式和"\\1"的含義就行了Search and Replace With Regular Expressions,千變?nèi)f化都可以。


            get_filename_component

            這個命令就更好理解了,把目錄名當(dāng)成文件名就行了;


            獲取當(dāng)前目錄名:


            get_filename_component(CURRENT_FOLDER ${CURRENT_FOLDER_ABSOLUTE} NAME)

            獲取上層目錄名:


            get_filename_component(SECOND_FOLDER_ABSOLUTE ${CURRENT_FOLDER_ABSOLUTE} DIRECTORY)

            get_filename_component(SECOND_FOLDER ${SECOND_FOLDER_ABSOLUTE} NAME)

            ————————————————


                                        版權(quán)聲明:本文為博主原創(chuàng)文章,遵循 CC 4.0 BY-SA 版權(quán)協(xié)議,轉(zhuǎn)載請附上原文出處鏈接和本聲明。

                                    

            原文鏈接:https://blog.csdn.net/FlushHip/article/details/114677610



            *博客內(nèi)容為網(wǎng)友個人發(fā)布,僅代表博主個人觀點,如有侵權(quán)請聯(lián)系工作人員刪除。



            關(guān)鍵詞: cmake

            技術(shù)專區(qū)

            關(guān)閉