我们已经介绍过单目录结构与多目录结构的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(其三)相关推荐

  1. r语言读取C盘的csv文件,R语言开发之CSV文件的读写操作实现

    在R中,我们可以从存储在R环境外部的文件读取数据,还可以将数据写入由操作系统存储和访问的文件.这个csv文件应该存在于当前工作目录中,以方便R可以读取它, 当然,也可以设置自己的目录,并从那里读取文件 ...

  2. R语言开发之EXCEL文件的读写操作了解下

    Microsoft Excel是使用最广泛的电子表格程序,它是以.xls或.xlsx格式存储数据. R可以使用某些excel特定的包直接读取这些文件的内容,一些常用的软件包有 - XLConnect, ...

  3. R语言开发之CSV文件的读写操作了解下

    在R中,我们可以从存储在R环境外部的文件读取数据,还可以将数据写入由操作系统存储和访问的文件.这个csv文件应该存在于当前工作目录中,以方便R可以读取它, 当然,也可以设置自己的目录,并从那里读取文件 ...

  4. iOS开发之c语言入门教程

    苹果作为移动互联的高端品牌,iOS操作系统也被用户公认为是最好用的移动互联网操作系统.据了解,曾一度拒绝为iOS平台对出浏览器的火狐在今年5月份的时候,他们却食言了.今天,Mozilla宣布iOS版F ...

  5. ios c语言调用oc方法,ios开发之OC基础-类和对象(示例代码)

    本系列的文章主要来自于个人在学习前锋教育-欧阳坚老师的iOS开发教程之OC语言教学视频所做的笔记,边看视频,边记录课程知识点.建议大家先过一遍视频,在看视频的过程中记录知识点关键字,把把握重点,然后再 ...

  6. 【转载】Android逆向开发之smali语言的学习

    Android逆向开发之smali语言的学习 该文转载自乱码三千 – 分享实用IT技术 smali和java基本数据类型对比 smali java B byte S short I int J lon ...

  7. 《高质量程序设计指南——C/C++语言》第1章 高质量软件开发之道

    第1章 高质量软件开发之道 本书的第1章之高质量软件开发之道,作者用大量的篇幅介绍了"软件质量"的基本概念,解释了软件质量的十大属性.这十大质量属性又分为功能性和非功能性两类,功能 ...

  8. 图片轮播c语言,IOS开发之UIScrollView实现图片轮播器的无限滚动

    IOS开发之UIScrollView实现图片轮播器的无限滚动 简介 在现在的一些App中常常见到图片轮播器,一般用于展示广告.新闻等数据,在iOS内并没有现成的控件直接实现这种功能,但是通过UIScr ...

  9. 谷歌的AI应用开发之道

    https://www.toutiao.com/a6718151019873698308/ 全球AI第一大厂,打造AI产品时有何指导思想? 软件+硬件+AI. 没错,这是谷歌CEO皮猜在Google ...

最新文章

  1. JavaScript之js的一些基础方法
  2. 关于 调用 JNI JAR java 的说明和注意事项,调用第 靠写不下了
  3. 二次创业成功人士的19个经验与教训
  4. class priority_queue 简单介绍
  5. 如何在vs2010中修改栈的大小
  6. NOIP练习赛题目6
  7. python爬虫scrapy连接mongodb_爬虫框架scrapy和数据库MongoDB的结合使用(二)实战
  8. 微软结束 SolarWinds 事件调查:部分源代码被盗,1000人参与
  9. EasyUI----增删改查
  10. 【springssm加载applicationContext.xml文件的一个坑】
  11. Spring Data + Thymeleaf 3 + Bootstrap 4 实现分页器
  12. Python 多线程-共享全局变量问题 -args参数 同步的概念
  13. java实现分时问候,asp实现语音分时问候_asp实例
  14. html个人主题制作,个人网页制作
  15. Discuz X 3.4 系列漏洞梳理
  16. 分享117个PHP源码,总有一款适合你
  17. ExoPlayer播放器播放MP2音频格式视频无声音加入Ffmpeg软解码功能
  18. php redis 搜索,一步步实现 Redis 搜索引擎
  19. 个人介绍 php 怎么说,个人介绍怎么写
  20. 互联网经济的背后-梅特卡夫效应与双边市场效应

热门文章

  1. 如何更改Win7桌面路径
  2. Android武器库
  3. 微信支付分开通攻略!
  4. 怎么使用ai人工智能聊天
  5. Java图形化界面编程之——AWT
  6. 博客园右下角添加看板娘
  7. 你会在命令行下高效管理 Github 上的项目吗,用上这个神器后助你秒实现!
  8. 数据要素市场研究资料合集
  9. LCD1602和12864显示器-第1季第17部分-朱有鹏-专题视频课程
  10. 安徽大学计算机大赛,2019年安徽大学机器人大赛成功举办