使用Cmake管理項目的跨平臺C++應用程序
MSDN參考文檔:https://docs.microsoft.com/zh-cn/cpp/build/cmake-projects-in-visual-studio?view=msvc-160
使用CMake管理項目,再使用標準C++作爲開發語言,就可以創建完全跨平臺的C++應用程序。
1)創建CMake項目,從VS2019的項目解釋可以看出,CMake是作爲一個跨平臺的管理工具存在,而不僅僅是Linux項目;
2)切換到CMake視圖,這個很重要,因爲默認爲文件夾視圖,不方便對子項目分別進行生成等操作:
切換到解決方案視圖,找到這個按鈕,單擊一次:
出現選擇視圖,然後雙擊選中的視圖類型,這裏選擇CMake目標視圖,進入CMake開發視圖:
這裏就是CMake目標視圖,右鍵單擊項目,可以添加新的目標(即添加新的子項目),全部生成,清理等,同樣單擊某個項目也有類似的操作菜單:
這裏解釋下CMake緩存的意思:如果選擇生成緩存,CMake會解析CMakeLists.txt文件,並生成CMake項目視圖;必須這裏有exe生成項目,也有dll生成項目,如果清除這些緩存,就只剩下CMakeLists.txt文件了。
需要注意的是,在輸出欄需要選擇不同的輸出來源才能看到CMake過程,大多數默認都是生成輸出來源,如果需要了解CMake的過程,可以切換到CMake來源。
3)添加一個名爲Common的動態庫項目:
//common.h
#pragma once
#ifdef _WIN32
#define COMMON_EXPORT _declspec(dllexport)
#else
#define COMMON_EXPORT
#endif // _WIN32
namespace BGI
{
namespace Common
{
COMMON_EXPORT void add(int v1, int v2);
}
}
//common.cpp
#include <iostream>
#include <chrono>
#include <thread>
#include "Common.h"
using namespace std;
namespace BGI
{
namespace Common
{
static void threadproc(int* value)
{
for (int i = 0; i < 10; i++)
{
*value += 1;
std::this_thread::sleep_for(std::chrono::milliseconds(100));
}
}
void add(int v1, int v2)
{
thread t1(threadproc, &v1);
thread t2(threadproc, &v2);
t1.join();
t2.join();
cout << "Value[0] = " << v1 << endl;
cout << "Value[1] = " << v2 << endl;
}
}
}
添加完成後選擇生成試試。需要注意的是,如果要生成Windows下的動態庫,還需要生成Common.lib文件,因此需要導出動態庫接口:_declspec(dllexport);由於是跨平臺項目,Linux項目無法設置導出接口,需要做宏限制。
4)在主項目上將Common子項目添加到引用,這一步會重新生成CMake緩存:
因爲改變了主項目的CMakeLists.txt文件,增加了target_link_libraries(LinuxCmakeTest "Common")這一欄。這是CMake添加引用項目的方式。
5)重定向程序輸出目錄
給debug和release不同的輸出目錄;並將dll和exe都輸出到同一個目錄下,以免找不到dll的情況;並將輸出目錄設置爲鏈接庫搜索目錄;將當前CMakeLists.txt所在目錄設置爲搜索目錄,這樣最大的好處是,在某個項目中包含其他項目的頭文件,不必使用#include "../Common/common.h",而可以直接使用#include "Common/common.h"。
6)設置安裝腳本。如果需要提供安裝功能,添加install命令到CMakeLists.txt文件中:
保存文件後VS會自動重新解析文件,然後點擊工程屬性就可以看到【安裝】菜單欄可用,點擊安裝,會將程序打包安裝到\out\install\目錄下。
可以通過CMake設置頁面重定向安裝目錄路徑:
install安裝後的文件少了.ink,.pdb,.exp等額外文件。
到此爲止,這個程序已經可以在Windows平臺編譯並輸出結果。但配置到Linux仍需要一些額外的配置才能正確運行。
7)新建Linux平臺下的CMake配置,這裏選擇通用的Linux-GCC-Debug,如果是Release則選擇Linux-GCC-Release:
8)設置遠程調試Linux平臺:
9)設置完成後保存,自動解析CMakeLists.txt文件,如果遠程沒有安裝高版本cmake文件,VS會自動提示,可以點擊【是】讓VS自動幫忙安裝一個符合要求的cmake版本:
這裏需要注意的是,CentOS默認安裝cmake2.8,很舊很舊的版本。使用VS開發Linux至少需要cmake3.8版本以上。