C语言开发之CMakeList(其三)
我們已經(jīng)介紹過單目錄結(jié)構(gòu)與多目錄結(jié)構(gòu)的CMakeLists.txt使用方法,下面介紹如何利用CMakeLists實(shí)現(xiàn)類似于C++模板的東西。下面的內(nèi)容與單目錄結(jié)構(gòu)以及多目錄結(jié)構(gòu)CMakeLists實(shí)現(xiàn)密接相關(guān),建議看完前兩個(gè)再看這一篇。
應(yīng)用場(chǎng)景
開發(fā)某個(gè)基于C語(yǔ)言的項(xiàng)目,要求實(shí)現(xiàn)單精度與雙精度計(jì)算版本。
目錄結(jié)構(gòu)
|--examples| |--add_example.c| |--sub_example.c| |--CMakeLists.txt|--CMakeLists.txt|--include| |--alg.h|--alg| |--add| | |--add.c| | |--CMakeLists.txt| |--sub| | |--sub.c| | |--CMakeLists.txt| |--CMakeLists.txt| |--utils| | |--alg_template.h其中examples/add_example.c
#include "alg.h" #include<stdio.h>int main(){double a = 1.1, b = 2.1;printf("add:%lf\n", my_add64(a, b));return 0; }example/sub_example.c
#include "alg.h" #include<stdio.h>int main(){float a = 1.1, b = 2.0;printf("sub:%f\n", my_sub32(a, b));return 0; }include/alg.h
#ifndef __ALG_H #define __ALG_Hfloat my_sub32(float a, float b); float my_add32(float a, float b); double my_sub64(double a, double b); double my_add64(double a, double b);#endifalg/add/add.c
#include "alg.h" #include "alg/utils/alg_template.h"FLOAT DT(my_add)(FLOAT a, FLOAT b){return a + b; }alg/sub/sub.c
#include "alg.h" #include "alg/utils/alg_template.h"FLOAT DT(my_sub)(FLOAT a, FLOAT b){return a - b; }alg/utils/alg_template.h
#ifndef __ALG_TEMPLATE_H #define __ALG_TEMPLATE_H#ifdef ALG32#define FLOAT float#define DT(func) func##32 #endif #ifdef ALG64#define FLOAT double#define DT(func) func##64 #endif#endif如果我們可以分別#define ALG32,再#define ALG64,分開編譯再合并,那么就可以實(shí)現(xiàn)多精度項(xiàng)目了。
注意#include “alg/utils/alg_template.h”,頭文件寫成這樣是因?yàn)樵贑MakeLists.txt中添加了include_directories(${CMAKE_CURRENT_SOURCE_DIR})指定最外層目錄為include起始位置。
alg/CMakeLists.txt 注意實(shí)現(xiàn)多精度精華的地方add_library(… OBJECT …)
#老三段 cmake_minimum_required(VERSION 2.8) project(simple_alg_exe) set(CMAKE_C_STANDARD 99)#設(shè)置LIBRARY_OUTPUT_PATH為庫(kù)的輸出位置 SET(LIBRARY_OUTPUT_PATH ${CMAKE_CURRENT_SOURCE_DIR}/../lib) #將文件夾內(nèi)存在CMakelist的所有文件命名為MODULES set(MODULESaddsub )foreach(module ${MODULES})#執(zhí)行每一個(gè)文件夾里面的CMakeLists.txt腳本add_subdirectory(${module}) endforeach()#注意不同于STATIC,OBJECT并不會(huì)在這里生成庫(kù),而是在下一次使用add_library()時(shí)生成 add_library(alg64 OBJECT ${SRCS}) add_library(alg32 OBJECT ${SRCS})#分別為alg32/alg64指定編譯標(biāo)識(shí),-D即define,-DALG32 表示在代碼開頭#define ALG32 #通過這種方式,我們可以為代碼分別指定32位版本與64位版本 set_target_properties(alg64PROPERTIES COMPILE_FLAGS "${COMPILE_FLAGS} -DALG64" ) set_target_properties(alg32PROPERTIES COMPILE_FLAGS "${COMPILE_FLAGS} -DALG32" )#第二次使用add_library,生成庫(kù) #表示將alg32與alg64合并生成alg庫(kù) add_library(alg STATIC $<TARGET_OBJECTS:alg64> $<TARGET_OBJECTS:alg32>)#將alg.h頭文件發(fā)布到${CMAKE_CURRENT_SOURCE_DIR}/../output/include目錄中,當(dāng)然可以寫一些其它的目錄,如/usr/local/lib64/include install(FILES ../include/alg.h DESTINATION ${CMAKE_CURRENT_SOURCE_DIR}/../output/include) #將libalg.a靜態(tài)庫(kù)文件發(fā)布到${CMAKE_CURRENT_SOURCE_DIR}/../output/lib目錄中 install(FILES ../lib/libalg.a DESTINATION ${CMAKE_CURRENT_SOURCE_DIR}/../output/lib)傳送門
C語(yǔ)言開發(fā)之CMakeLists以及gtest測(cè)試在C語(yǔ)言中的使用方法(其四)
C語(yǔ)言開發(fā)之CMakeList(其三)
C/C++開發(fā)之CMakeList(其二)
C/C++開發(fā)之CMakeLists(其一)
總結(jié)
以上是生活随笔為你收集整理的C语言开发之CMakeList(其三)的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 解读:斐讯公有云缘何快速上位?
- 下一篇: Basler相机硬触发的接线方法