程序的編寫需要用到頭文件,程序的編譯需要lib文件,程序的運行需要dll文件,因此cmake引入第三方庫其實就是將include目錄、lib目錄、bin目錄引入工程。
????????目錄
1、find_package(批量引入庫文件和頭文件)
2、include_directories(引入頭文件目錄)
3、link_directories(引入庫文件目錄到當(dāng)前工程)
4、link_libraries (引入庫文件到當(dāng)前工程)
5、target_link_libraries(引入庫文件到子工程)
6、target_include_directories(引入頭文件目錄到子工程)
1、find_package(批量引入庫文件和頭文件)
find_package 的詳細使用:find_package 的詳細使用
find_package 需要通過 .cmake 為后綴的文件引入,能夠?qū)?.cmake 包含的庫和頭文件全部引入工程。不同的庫的達到的效果不同。有時需要搭配關(guān)鍵字使用:
- REQUIRED:必須找到該庫,找不到就報錯
- COMPONENTS:從庫中找子庫(模塊)xx,比如COMPONENTS Widget表示找到子模塊Widget
以O(shè)penCV庫為例,OpenCV庫提供的是 OpenCVConfig.cmake文件,只需引入一次,便可以將OpenCV所有的庫文件和頭文件引入到當(dāng)前工程。OpenCVConfig.cmake 也給出了詳細的說明。
find_package(OpenCV REQUIRED)
# OpenCV_INCLUDE_DIRS 是預(yù)定義變量,代表OpenCV庫的頭文件路徑
include_directories(${OpenCV_INCLUDE_DIRS})
# OpenCV_LIBS 是預(yù)定義變量,代表OpenCV庫的lib庫文件
target_link_libraries(MY_TARGET_NAME ${OpenCV_LIBS})
以QT庫為例,QT庫是一個大型庫,內(nèi)部還包含了許多子庫,在引入的時候最好按需引入
# 含義:必須找到Qt5庫的子模塊Core,找不到就報錯
find_package(Qt5 COMPONENTS Core REQUIRED)
# 鏈接時需要加上前綴Qt::(這里是Qt5的庫)
target_link_libraries(qt_test
Qt5::Core
)
注意:無論是上面的Widget,還是Core,都是去掉了前綴Qt5。實際上,Qt的子庫名字都是有前綴 "Qt5" 的!只不過在引入的時候,要去掉。
2、include_directories(引入頭文件目錄)
include_directories表示引入頭文件搜索路徑,當(dāng)工程要用到某個頭文件的時候,就會去該路徑下搜索。一般都是在頂層的CmakeList文件中添加搜索路徑。
include_directories(完整路徑)
# 絕對路徑引入
include_directories("D:\\ProgramFiles\\Qt\\qt5_7_lib_shared_64\\include")
# 普通變量引入(可以理解為把D:\\ProgramFiles\\Qt\\qt5_7_lib_shared_64放入一個集合INCLUDE_PATH)
# ${變量名} 可以獲取集合內(nèi)容,允許拼接
set (INCLUDE_PATH D:\\ProgramFiles\\Qt\\qt5_7_lib_shared_64)
include_directories(${INCLUDE_PATH}/include)
# 環(huán)境變量引入
# 假設(shè)環(huán)境變量是INCLUDE_PATH = D:\\ProgramFiles\\Qt\\qt5_7_lib_shared_64
# #ENV{環(huán)境變量名} 可以獲取環(huán)境變量的內(nèi)容,允許拼接
include_directories($ENV{INCLUDE_PATH}/include)
一個cmake總工程可以包含多個子工程,總工程引入的頭文件,并不代表子工程就可以用,就好比幼兒園老師(總工程)買來一箱蘋果,小朋友(子工程)根據(jù)需求拿蘋果。
3、link_directories(引入庫目錄——添加庫文件的搜索路徑)
link_libraries 表示添加第三方 lib 庫文件的搜索路徑。若工程在編譯的時候會需要用到某個第三方庫的 lib 文件,此時就可以使用 link_libraries 來添加搜索路徑。
link_libraries(完整路徑)
# 絕對引入
link_libraries("D:\ProgramFiles\Qt\qt5_7_lib_shared_64\lib")
# 預(yù)定義變量引入
# PROJECT_SOURCE_DIR 是cmake的預(yù)定義變量,表示頂層CmakeList文件所在路徑
link_libraries(${PROJECT_SOURCE_DIR}/ExtLib/ffmpeg/win64/lib)
# 環(huán)境變量引入
# 環(huán)境變量 QT_LIB = D:\\ProgramFiles\\Qt\\qt5_7_lib_shared_64
link_libraries($ENV{QT_LIB}/lib)
4、link_libraries (引入庫文件)
link_libraries 表示將具體的庫文件引入到當(dāng)前工程中,所填入的路徑必須是全路徑。
# 全路徑引入
LINK_LIBRARIES("/opt/MATLAB/R2012a/bin/glnxa64/libeng.so")
5、target_link_libraries(引入庫文件到子工程)
target_link_libraries 表示添加第三方 lib 庫文件到目標(biāo)子工程,上面 link_directories 是引入庫目錄到當(dāng)前工程,link_libraries 是引入庫文件到當(dāng)前工程,具體是哪個工程并沒有指明。就好比,貨車把滿載的貨物運到幼兒園里,但是沒分配。
target_link_libraries 起的作用就是分發(fā)工作,分發(fā)xx庫給指定工程,注意xx庫必須是當(dāng)前工程中有的或者 搜索路徑里有的。文章來源:http://www.zghlxwxcb.cn/news/detail-492007.html
target_link_libraries(子工程名 庫文件1 庫文件2 ...) # 注意子工程名和庫文件名之間以空格隔開
add_executable(qt_test ${ALL_SRCS}) # 子工程名是 qt_test
# 絕對路徑引入
target_link_libraries(qt_test
D:\\ProgramFiles\\Qt\\qt5_7_lib_shared_64\\lib\\Qt5Core.lib
D:\\ProgramFiles\\Qt\\qt5_7_lib_shared_64\\lib\\Qt5Gui.lib
)
# 普通變量引入(被打包的lib文件,必須能在搜索路徑下找到)
set (LIB_FFMPEG "avcodec.lib" "avdevice.lib" "avfilter.lib")
target_link_libraries(qt_test
${LIB_FFMPEG}
)
# 預(yù)定義變量引入
# PROJECT_SOURCE_DIR 是cmake的預(yù)定義變量,表示頂層CmakeList文件所在路徑
target_link_libraries(qt_test
${PROJECT_SOURCE_DIR}/ExtLib/ffmpeg/win64/lib/avcodec.lib
)
6、target_include_directories(引入頭文件目錄到子工程)
target_include_directories 達到的效果和?target_link_libraries 是類似的,需要注意的是文章來源地址http://www.zghlxwxcb.cn/news/detail-492007.html
- include_directories:將頭文件目錄引入到當(dāng)前工程
- target_include_directories:將頭文件目錄針對性的引入到目標(biāo)子工程(當(dāng)前工程一般可以包含多個子工程)?
到了這里,關(guān)于【cmake學(xué)習(xí)】cmake 引入第三方庫(頭文件目錄、庫目錄、庫文件)的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!