日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

C语言开发之CMakeList(其三)

發布時間:2023/12/31 编程问答 26 豆豆
生活随笔 收集整理的這篇文章主要介紹了 C语言开发之CMakeList(其三) 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

我們已經介紹過單目錄結構與多目錄結構的CMakeLists.txt使用方法,下面介紹如何利用CMakeLists實現類似于C++模板的東西。下面的內容與單目錄結構以及多目錄結構CMakeLists實現密接相關,建議看完前兩個再看這一篇。

應用場景

開發某個基于C語言的項目,要求實現單精度與雙精度計算版本。

目錄結構

|--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);#endif

alg/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,分開編譯再合并,那么就可以實現多精度項目了。
注意#include “alg/utils/alg_template.h”,頭文件寫成這樣是因為在CMakeLists.txt中添加了include_directories(${CMAKE_CURRENT_SOURCE_DIR})指定最外層目錄為include起始位置。

#最小cmake版本 cmake_minimum_required(VERSION 2.8) #項目名字,隨意起 project(simple_exe) #設置C/c++版本(如c99,c++11,c++17等版本),下面表示使用c99版本 set(CMAKE_C_STANDARD 99)#指定include目錄,作用域為全局,包括子目錄中的CMakeLists include_directories(${CMAKE_CURRENT_SOURCE_DIR}/include/) include_directories(${CMAKE_CURRENT_SOURCE_DIR}) #指定靜態庫輸出路徑,作用域為全局,包括子目錄中的CMakeLists link_directories(${CMAKE_CURRENT_SOURCE_DIR}/lib)#將文件夾內存在CMakelist的所有文件命名為MODULES set(MODULESalgexamples )foreach(module ${MODULES})#執行每一個文件夾里面的CMakeLists.txt腳本add_subdirectory(${module}) endforeach()

alg/CMakeLists.txt 注意實現多精度精華的地方add_library(… OBJECT …)

#老三段 cmake_minimum_required(VERSION 2.8) project(simple_alg_exe) set(CMAKE_C_STANDARD 99)#設置LIBRARY_OUTPUT_PATH為庫的輸出位置 SET(LIBRARY_OUTPUT_PATH ${CMAKE_CURRENT_SOURCE_DIR}/../lib) #將文件夾內存在CMakelist的所有文件命名為MODULES set(MODULESaddsub )foreach(module ${MODULES})#執行每一個文件夾里面的CMakeLists.txt腳本add_subdirectory(${module}) endforeach()#注意不同于STATIC,OBJECT并不會在這里生成庫,而是在下一次使用add_library()時生成 add_library(alg64 OBJECT ${SRCS}) add_library(alg32 OBJECT ${SRCS})#分別為alg32/alg64指定編譯標識,-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,生成庫 #表示將alg32與alg64合并生成alg庫 add_library(alg STATIC $<TARGET_OBJECTS:alg64> $<TARGET_OBJECTS:alg32>)#將alg.h頭文件發布到${CMAKE_CURRENT_SOURCE_DIR}/../output/include目錄中,當然可以寫一些其它的目錄,如/usr/local/lib64/include install(FILES ../include/alg.h DESTINATION ${CMAKE_CURRENT_SOURCE_DIR}/../output/include) #將libalg.a靜態庫文件發布到${CMAKE_CURRENT_SOURCE_DIR}/../output/lib目錄中 install(FILES ../lib/libalg.a DESTINATION ${CMAKE_CURRENT_SOURCE_DIR}/../output/lib)

傳送門

C語言開發之CMakeLists以及gtest測試在C語言中的使用方法(其四)
C語言開發之CMakeList(其三)
C/C++開發之CMakeList(其二)
C/C++開發之CMakeLists(其一)

總結

以上是生活随笔為你收集整理的C语言开发之CMakeList(其三)的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。