?項目中會有單個源文件構(gòu)建的多個可執(zhí)行文件的可能。項目中有多個源文件,通常分布在不同子目錄中。這種實踐有助于項目的源代碼結(jié)構(gòu),而且支持模塊化、代碼重用和關(guān)注點分離。同時,這種分離可以簡化并加速項目的重新編譯。
靜態(tài)庫
準備的文件
add.h
int add(int a,int b);
add.cpp
int add(int a,int b)
{
return a+b;
}
main.cpp
#include "add.h"
#include <iostream>
int main()
{
int a = 3,b = 4;
std::cout<<add(3,4)<<std::endl;
return 0;
}
CMakeLists文件
?首先這是我們的目錄結(jié)構(gòu)。我們需要先編譯靜態(tài)庫,所以我們會在外層的CMakeLists.txt文件中先編譯add文件夾中的靜態(tài)庫。
所以外層CMakeLists.txt文件的內(nèi)容為:
add_subdirectory(add)
add文件夾中的CMakeLists.txt文件
add_library(add_static add.cpp)
?add_library(add_static STATIC add.cpp):生成必要的構(gòu)建指令,將指定的源碼編譯到庫中。add_library的第一個參數(shù)是目標名。整個CMakeLists.txt中,可使用相同的名稱來引用庫。生成的庫的實際名稱將由CMake通過在前面添加前綴lib和適當?shù)臄U展名作為后綴來形成。生成庫是根據(jù)第二個參數(shù)(STATIC或SHARED)和操作系統(tǒng)確定的。
使用靜態(tài)庫
?接下來我們需要在外層main.cpp文件中使用該靜態(tài)庫。
add_subdirectory(add)
include_directories(./lib)
add_executable(lesson2_1 main.cpp)
target_link_libraries(lesson2_1 ${CMAKE_CURRENT_SOURCE_DIR}/lib/add_static.lib)
?target_link_libraries(lesson2_1 ${CMAKE_CURRENT_SOURCE_DIR}/lib/add_static.lib): 將庫鏈接到可執(zhí)行文件。此命令還確??蓤?zhí)行文件可以正確地依賴于靜態(tài)庫。因此,在靜態(tài)鏈接到可執(zhí)行文件之前,需要完成靜態(tài)庫的構(gòu)建。
?我們先把編譯好的靜態(tài)庫和頭文件放到lib文件夾下。
最后的編譯結(jié)果。
動態(tài)庫
準備的文件
add.cpp
#include <iostream>
#include "export.h"
CMAKE_STUDY_API int add(int a,int b)
{
return a+b;
}
add.h
#include "export.h"
CMAKE_STUDY_API int add(int a,int b);
export.h
#pragma once
#ifdef EXPORT
#define CMAKE_STUDY_API __declspec(dllexport)
#else
#define CMAKE_STUDY_API __declspec(dllimport)
#endif
main.cpp
#include "add.h"
#include <iostream>
int main()
{
int a = 3,b = 4;
std::cout<<add(3,4)<<std::endl;
return 0;
}
CMakeLists文件
以上為目錄結(jié)構(gòu)
?與靜態(tài)庫一樣,我們都需要先編譯動態(tài)庫,然后再編譯可執(zhí)行文件。
所以我們外部的CMakeLists.txt文件為:
add_subdirectory(add)
add文件夾下的CMakeLists.txt文件為:
add_library(add_shared SHARED add.cpp)
target_compile_definitions(add_shared PRIVATE EXPORT)
由于在windows下的動態(tài)庫需要有宏定義來指定動態(tài)庫是導出還是導入。
target_compile_definitions(add_shared PRIVATE EXPORT)主要是用來定義該動態(tài)庫有個自定義的宏EXPORT。
使用動態(tài)庫
?與靜態(tài)庫不同,在windows下我們生成的動態(tài)庫會有一個lib文件和一個dll文件,lib文件是動態(tài)庫函數(shù)的導出符號文件。
外部的CMakeLists.txt文件:
add_subdirectory(add)
include_directories(./lib)
add_executable(lesson2_2 main.cpp)
target_link_libraries(lesson2_2 ${CMAKE_CURRENT_SOURCE_DIR}/lib/add_shared.lib)
我們先把頭文件和lib文件都拷貝到lib文件夾下。
然后再把生成的dll文件拷貝到生成的可執(zhí)行文件的目錄下。否則會出現(xiàn)缺失dll文件的錯誤。
最后的執(zhí)行結(jié)果。
使用OpenCV庫
?我們先從官網(wǎng)上下載OpenCV的庫。
main.cpp
#include<iostream>
#include<opencv2/core/core.hpp>
#include<opencv2/highgui/highgui.hpp>
using namespace std;
using namespace cv;
int main(int argc, char** argv)
{
Mat image;
image = imread("C:/cmake_study/lesson2_opencv/1.jpeg");
if (image.data == nullptr)
{
//cout <<"圖片不存在" << endl;
}
else
{
imshow("meinv", image);
waitKey(0);
}
//cout << "圖像寬為:" << image.cols << "\t高度為:" << image.rows << "\t通道數(shù)為:" << image.channels() << endl
system("pause");
return 0;
}
CMakeLists.txt文件文章來源:http://www.zghlxwxcb.cn/news/detail-820280.html
include_directories(C:/3rd/opencv/build/include)
add_executable(lesson2_opencv main.cpp)
target_link_libraries(lesson2_opencv "C:/3rd/opencv/build/x64/vc16/lib/opencv_world480d.lib")
我們只需要指定OpenCV的lib文件的路徑和頭文件即可,最后將dll文件拷貝到可執(zhí)行文件的目錄下。文章來源地址http://www.zghlxwxcb.cn/news/detail-820280.html
到了這里,關(guān)于cmake-動態(tài)庫和靜態(tài)庫及使用OpenCV第三方庫的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!