以下內容為本人的著作,如需要轉載,請宣告原文鏈接 微信公眾號「englyf」https://mp.weixin.qq.com/s/o-_aGqreuQda-ZmKktvxwA
以往在公司開發眾多的專案中,都會出現要求本專案里部分功能模塊代碼需要具備保密性,如果需要對外輸出demo工程,那么需要做到不會泄密,
舉一下爪子,以前做雷達開發的時候,客戶從公司那兒買了這些雷達模塊,也會需要從作為供應商的廠家這里拿到這些模塊的開發demo(也就是示范軟體工程),但是由于demo里可能會用到一些涉及計算的內部演算法函式呼叫,這些函式的實作屬于公司商業機密是不能對外公開的,于是就提出了對部分代碼保密的需求,
那么,怎么引入和管理這些需要保密的代碼模塊呢?一般的做法就是將需要保密的功能模塊以子專案的形式引入到demo工程,這些子專案在編譯時輸出庫檔案,而demo工程則通過子專案提供的介面頭檔案參考這些庫提供的介面,最后在打包輸出demo工程之前,會把涉及保密功能模塊所屬的子專案原始碼從工程目錄樹中洗掉掉,被清理掉的子專案只留下生成的庫檔案和參考頭檔案(如果你的工程用的開發語言是C/C++),
下面就繼續用 Qt Quick 的開發示例來展開(果然,,,),這個示例里會實作一個簡單的加法GUI小工具,計算程序所用到的演算法以庫API的形式提供,演算法原始碼封裝在庫里,
本示例工程完整代碼見文末鏈接分享!
設計工程目錄
為了方便呼叫涉密的功能模塊的介面以及打包輸出不包含涉密模塊原始碼的demo工程,介面的實作原始碼存放在對應模塊的子工程(子專案)目錄內,而介面的宣告所在的頭檔案和涉密模塊編譯后輸出的庫檔案需要存放在對應模塊子專案的檔案夾之外,之所以這樣安排存放位置,是為了方便打包輸出時對demo工程的清理,
看看我的工程目錄:

這里有兩個專案,一個頂層工程專案,也就是demo工程,命名為 gettingStartWithQtQuickSubProject,存放目錄與工程名一致,另一個是子專案,里邊代表著涉密模塊的功能原始碼,命名為math,每個專案都對應一個CMakeLists.txt組態檔,其他檔案視乎專案內容需要而定,
配置子專案
子專案 ./math/src/ 目錄下存放著涉密模塊的實作原始碼,這里只是簡單地演示了加法的計算介面
/* inside file MyMath.cpp */
#include "MyMath.h"
myMath::myMath(QObject *parent) : QObject(parent)
{}
QVariant myMath::sum(QVariant a, QVariant b)
{
return a.toInt() + b.toInt();
}
定義介面源檔案
子專案math的所有源檔案都存放在 ./math/src/ 目錄下,所以將該目錄指定為源檔案搜索目錄,并將搜索結果存到cmake自定義變數DIR_SRCS中,
aux_source_directory(${CMAKE_CURRENT_SOURCE_DIR}/src DIR_SRCS)
變數CMAKE_CURRENT_SOURCE_DIR是cmake自帶變數,指向當前所屬專案的組態檔所在目錄,也即是 ./math/,
包含介面頭檔案
介面宣告所在的頭檔案存放在demo專案的./src/include/中,在子專案中包含對應的目錄需要通過demo專案的原始碼目錄相對地指定,
include_directories(${CMAKE_SOURCE_DIR}/src/include)
變數CMAKE_SOURCE_DIR指向的內容就是頂層專案的組態檔(CMakeLists.txt)所在目錄,這里的demo專案就是頂層專案,
配置輸出庫檔案
子專案編譯后輸出的庫檔案應該自動輸出到demo專案的./src/libs/中,可以通過設定cmake變數LIBRARY_OUTPUT_PATH來實作,
SET(LIBRARY_OUTPUT_PATH "${CMAKE_SOURCE_DIR}/src/libs")
配置頂層專案(demo專案)
我們以demo專案為頂層專案,根據實際專案需要,本來是可以添加各式各樣的子專案,但是這里根據示例需要僅添加math子專案,
添加子專案
本專案作為頂層專案,組態檔(CMakeLists.txt)中除了要描述清楚本專案的配置內容,還需要指明添加了哪些子專案,而且子專案需要在編譯頂層專案之前被編譯完成,
add_subdirectory(${CMAKE_CURRENT_SOURCE_DIR}/math)
如上,利用指令add_subdirectory添加了子專案math,此陳述句必須在add_executable陳述句之前,在完整工程編譯鏈接后,打包輸出demo工程時,需要手動洗掉此陳述句,因為客戶在拿到demo工程后,不需要重新編譯子專案的內容,而是直接使用庫檔案即可,
添加介面頭檔案
為了簡化添加源檔案和頭檔案的程序,采用遞回目錄搜索的方式,將指定目錄下所有需要的檔案檢索到cmake自定義變數SRC_FILES中,方便后邊的編譯參考
file(GLOB_RECURSE SRC_FILES
${CMAKE_CURRENT_SOURCE_DIR}/src/*.cpp
${CMAKE_CURRENT_SOURCE_DIR}/src/*.h
)
介面頭檔案所在的目錄./src/include也包含在上面的檢索程序中了
添加鏈接庫檔案
指定鏈接目錄以及鏈接的庫math
link_directories(${CMAKE_CURRENT_SOURCE_DIR}/src/libs)
link_libraries(math)
輸出demo工程包
完整編譯執行一遍demo工程后,庫檔案會被自動保存在demo工程目錄下,編譯程序中,各專案是分開按順序編譯鏈接的,先是子專案,然后才是頂層專案demo,
為了之后能單獨編譯鏈接demo專案內容,需要洗掉math目錄,并且在demo工程的頂層CMakeLists.txt檔案中,把添加子專案math的陳述句洗掉即可,
執行一下上面的工程

點擊=執行

好了,簡單演示到這里,歡迎后續交流...
本示例工程完整代碼git倉庫鏈接: [email protected]:ifi-leung/gettingStartWithQtQuickSubProject.git
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/518456.html
標籤:C++
