c++打包編譯
- 1 在不用系統中打包介紹
- 1.1 linux中打包c++程序的2種方式
- 1.2 windows中打包c++程序
- 1.3 cmake+Ninja和cmake+make的兩種方式對比
- 1.3.1 Ninja是什么(可以認為是make工具的一個替代產品)
- 1.3.2 cmake+Ninja可以用于linux和windows系統中,編譯效率比cmake+make更高
- 1.3.3 cmake+make可以用于linux系統中,不要在windows系統中用
- 1.4 cmake+make的編譯方式只可以用于linux系統中,不能用于windows系統中,為什么還說可以跨平臺使用呢?
- 1.5 安裝g++、cmake、make軟件
- 2 linux中第1種g++命令(直接但是復雜,不常用)
- 3 linux中第2種打包方式cmake命令+make命令(難但是方便,常用)
- 3.1 編譯的流程
- 3.1.1 第1步:準備好項目代碼
- 3.1.2 第2步:編寫CMakeLists.txt文件
- 3.1.3 第3步:創建指定文件夾并用cmake生成構建系統
- 3.1.4 第4步:編譯項目
- 3.1.5 第5步:運行程序
- 3.2 幾個疑問點解釋
- 3.2.1 為什么要創建build文件夾
- 3.2.2 cmake命令為什么是cmake ..
- 3.2.3 cmake ..為什么能夠找到上級目錄的CMakeLists.txt文件?并沒有指定CMakeLists.txt文件呀?
- 3.2.4 cmake具體干了什么?
- 3.3 cmake和make的區別
- 3.4 第2種cmake+make打包方法為什么能夠實現跨平臺?實現跨平臺是cmake的功勞還是make的功勞?
- 3.5 只有在linux中編譯c++代碼才能使用第2種cmake+make打包方法,在windows中 使用CMake + 構建工具(如 Make/Ninja/MSBuild) 的組合
- 4 cmake的1個案例和相關語法
- 5 make的相關語法進一步介紹
這篇博客是在上一篇博客的基礎上增加了cmake的相關知識,更多打包和第3方庫的情況,可以看下面這篇博客。
c++下程序的運行(第3方庫的安裝及安裝gdal)_c++安裝庫-CSDN博客
1 在不用系統中打包介紹
1.1 linux中打包c++程序的2種方式
linux中工作中打包時,下面的第1種方式g++和第2種方式cmake+make都推薦,更傾向于第2種方式。
c++的2種打包方式
-
方式一:使用g++編譯器命令:
第1種方式是使用g++命令,通過g++命令進行打包,但是可能需要一長串打包命令。但是對于簡單的項目,打包命令就比較簡單一些。 -
方式二:使用cmake和make命令打包:
編寫CMakeLists.txt文件,通過cmake命令生成對應平臺的makefile文件或.sln文件。最后使用make命令生成可執行程序或者第三方庫。 -
2種方式的對比:
g++:
適合小項目;
第2種方式:
自動處理路徑分隔符、庫依賴等平臺差異。
支持生成多種構建系統(如 Makefile、Ninja、Xcode 項目等)。
1.2 windows中打包c++程序
c++常見的4種打包方式,另外還有好多種,不同的軟件可以都會有自己的編譯方式。
windows中打包文件,工作中只推薦2種方式:
第1種是使用集成開發環境自帶的,比如vs就用vs的打包方式,clion就用clion打包方式。
第2種是用MinGW-win64軟件的g++命令方式打包。
-
方式一:Visual Studio 的MSVC編譯的方式
-
方式二:使用cmake和其它構建工具命令打包:
編寫CMakeLists.txt文件,通過cmake命令生成對應平臺的的makefile文件或.sln文件。最后使用MinGW、Ninja等命令生成可執行程序或者第三方庫。
-
方式三:使用g++編譯器命令:
第1種方式是使用g++命令,通過g++命令進行打包,但是可能需要一長串打包命令。但是對于簡單的項目,打包命令就比較簡單一些。
- 方式四:clion軟件的編譯方式
1.3 cmake+Ninja和cmake+make的兩種方式對比
1.3.1 Ninja是什么(可以認為是make工具的一個替代產品)
1.3.2 cmake+Ninja可以用于linux和windows系統中,編譯效率比cmake+make更高
1.3.3 cmake+make可以用于linux系統中,不要在windows系統中用
1.4 cmake+make的編譯方式只可以用于linux系統中,不能用于windows系統中,為什么還說可以跨平臺使用呢?
cmake+make的編譯方式只可以用于linux系統中,不能用于windows系統中。
說的跨平臺這個概念方式,實際上專門指的是cmake這種方式,在windows中和linux中寫1個CMakeLists.txt文件,然后就可以使用cmake工具在linux或windows中創建配置中間文件了,這里實現了跨平臺。第2步編譯的時候make只能用于linux中,是不能跨平臺的。
1.5 安裝g++、cmake、make軟件
g++、cmake、make都是軟件,如果要使用,必須先在電腦上進行安裝好。然后添加到環境變量中
sudo yum install gcc gcc-c++
sudo yum install cmake
sudo yum install make
2 linux中第1種g++命令(直接但是復雜,不常用)
1 g++ -o executable_name source_file.cpp // 編譯普通文件
2 g++ -o your_program your_program.cpp -lgdal // 編譯帶gdal包的文件,默認從環境變量找頭文件和庫文件。
3 g++ -o your_program your_program.cpp -I/path/to/gdal/include -L/path/to/gdal/lib -lgdal // -I選項用于指定頭文件路徑,不涉及庫文件,-L選項用于指定庫文件所在的目錄,-l選項用于指定庫文件名。-lgdal指令會去找libgdal.a或者libgdal.so,-L和-l不管是動態庫還是靜態庫都一樣。-l選項后面跟的是庫文件的名稱,不需要包含文件擴展名。
4 g++ -o your_program your_program.cpp -I/path/to/gdal/include -Wl,-rpath,/path/to/gdal/lib -L/path/to/gdal/lib -lgdal // 防止運行時找不到動態庫文件,編譯程序時使用-Wl,-rpath選項來指定運行時庫文件的搜索路徑。
1、編譯時指定運行時的庫文件,有時候在打包時,動態庫本身依賴于其它動態庫,這時候出現找不到的情況,可以使用-Wl,-rpath指定,可以指定多個路徑,用冒號分隔:
g++ -o myapp src/main.cpp -L./lib -lmylib -Wl,-rpath=/path1:/path22、運行c++程序時,找不到動態庫,可以使用export加進來,這樣運行的時候就能找到第3方庫了
export LD_LIBRARY_PATH=/path/to/libs:$LD_LIBRARY_PATH
./myapp
3 linux中第2種打包方式cmake命令+make命令(難但是方便,常用)
3.1 編譯的流程
(1)準備好項目代碼;
(2)編寫CMakeLists.txt文件;
(3)創建指定文件夾并用cmake生成構建系統;
(4)make命令進行編譯
(5)運行程序
3.1.1 第1步:準備好項目代碼
3.1.2 第2步:編寫CMakeLists.txt文件
3.1.3 第3步:創建指定文件夾并用cmake生成構建系統
創建單獨的構建目錄(推薦)進去再使用cmake,不要在根目錄里使用cmake,這里約定俗成就是build目錄,因為cmake會生成很多文件,如果之后重新編譯等可以先把這個目錄直接刪除,而不用每個文件1個個刪除。
# 進入項目目錄
cd my_project# 創建構建目錄(推薦使用out-of-source構建)
mkdir build
cd build# 生成構建系統(根據你的系統選擇生成器)
# 在Linux/macOS上:
cmake ..# 在Windows上(如果使用Visual Studio):
# cmake .. -G "Visual Studio 16 2019"
3.1.4 第4步:編譯項目
# 編譯項目
# 或者在Linux/macOS上也可以直接使用make(如果cmake生成的是Makefile)
make# 也可以用這個命令
cmake --build .
3.1.5 第5步:運行程序
3.2 幾個疑問點解釋
3.2.1 為什么要創建build文件夾
3.2.2 cmake命令為什么是cmake …
3.2.3 cmake …為什么能夠找到上級目錄的CMakeLists.txt文件?并沒有指定CMakeLists.txt文件呀?
CMake 默認會在指定目錄中查找名為 CMakeLists.txt 的文件,這是 CMake 的內置約定,所有 CMake 項目都遵循這一規則。
3.2.4 cmake具體干了什么?
3.3 cmake和make的區別
- cmake … 只做配置,是一個生成配置的軟件。
它解析 CMakeLists.txt,檢查環境,生成構建系統文件(如 Makefile),但不會調用編譯器。 - make 或 cmake --build . 才是編譯
它們根據生成的構建系統文件,實際調用 g++/clang/msvc 等編譯器生成二進制文件。 - cmake … 不會直接生成可執行文件,它只是準備構建環境。必須再執行 make 或 cmake --build . 才會真正編譯代碼。使用2步而不是1步主要是因為CMake 的分離配置和編譯的設計哲學。
- cmake這種設計提高了跨平臺靈活性,也是現代構建系統的通用模式。它會根據
3.4 第2種cmake+make打包方法為什么能夠實現跨平臺?實現跨平臺是cmake的功勞還是make的功勞?
-
CMake 是跨平臺靈活性的核心實現者,它通過抽象平臺差異,生成適合當前環境的構建系統。
-
Make 是平臺相關的執行工具,其本身不具備跨平臺能力,依賴 CMake 為它生成平臺適配的 Makefile。
3.5 只有在linux中編譯c++代碼才能使用第2種cmake+make打包方法,在windows中 使用CMake + 構建工具(如 Make/Ninja/MSBuild) 的組合
4 cmake的1個案例和相關語法
# 設置CMake最低版本要求
cmake_minimum_required(VERSION 3.10)# 定義項目名稱和使用的語言(CXX表示C++)
project(MyProject LANGUAGES CXX)# 設置C++標準為C++17
set(CMAKE_CXX_STANDARD 17)
set(CMAKE_CXX_STANDARD_REQUIRED ON)# 查找OpenCV庫(需要提前安裝)
find_package(OpenCV REQUIRED)# 設置頭文件搜索路徑,使用空格或者換行分割多個路徑
include_directories(${OpenCV_INCLUDE_DIRS} # OpenCV頭文件路徑include # 項目主include目錄include/utils # 項目子目錄中的頭文件include/core # 項目子目錄中的頭文件third_party/include # 第三方庫頭文件
)# 設置動態庫搜索路徑,使用空格或者換行分割多個路徑
link_directories(lib # 項目主庫目錄lib/x64 # 項目子目錄中的庫third_party/lib # 第三方庫目錄${OpenCV_LIBRARY_DIRS} # OpenCV庫路徑
)# 收集所有源文件,遞歸查找
file(GLOB_RECURSE SOURCES "src/*.cpp" "src/*.cc")# 添加可執行文件
add_executable(${PROJECT_NAME} ${SOURCES})# 鏈接庫文件,使用空格或者換行分割多個庫
target_link_libraries(${PROJECT_NAME}${OpenCV_LIBS} # OpenCV庫utils # 項目內部庫core # 項目內部庫pthread # 系統線程庫dl # 動態加載庫
)
1、使用cmake進行打包,包含可執行程序和動態依賴庫_cmake 打包-CSDN博客
2、CMake 基本常用語法 CMakeLists.txt_cmakelist語法下載-CSDN博客
3 CMake常用命令_cmake命令-CSDN博客