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(其三)相关推荐
- r语言读取C盘的csv文件,R语言开发之CSV文件的读写操作实现
在R中,我们可以从存储在R环境外部的文件读取数据,还可以将数据写入由操作系统存储和访问的文件.这个csv文件应该存在于当前工作目录中,以方便R可以读取它, 当然,也可以设置自己的目录,并从那里读取文件 ...
- R语言开发之EXCEL文件的读写操作了解下
Microsoft Excel是使用最广泛的电子表格程序,它是以.xls或.xlsx格式存储数据. R可以使用某些excel特定的包直接读取这些文件的内容,一些常用的软件包有 - XLConnect, ...
- R语言开发之CSV文件的读写操作了解下
在R中,我们可以从存储在R环境外部的文件读取数据,还可以将数据写入由操作系统存储和访问的文件.这个csv文件应该存在于当前工作目录中,以方便R可以读取它, 当然,也可以设置自己的目录,并从那里读取文件 ...
- iOS开发之c语言入门教程
苹果作为移动互联的高端品牌,iOS操作系统也被用户公认为是最好用的移动互联网操作系统.据了解,曾一度拒绝为iOS平台对出浏览器的火狐在今年5月份的时候,他们却食言了.今天,Mozilla宣布iOS版F ...
- ios c语言调用oc方法,ios开发之OC基础-类和对象(示例代码)
本系列的文章主要来自于个人在学习前锋教育-欧阳坚老师的iOS开发教程之OC语言教学视频所做的笔记,边看视频,边记录课程知识点.建议大家先过一遍视频,在看视频的过程中记录知识点关键字,把把握重点,然后再 ...
- 【转载】Android逆向开发之smali语言的学习
Android逆向开发之smali语言的学习 该文转载自乱码三千 – 分享实用IT技术 smali和java基本数据类型对比 smali java B byte S short I int J lon ...
- 《高质量程序设计指南——C/C++语言》第1章 高质量软件开发之道
第1章 高质量软件开发之道 本书的第1章之高质量软件开发之道,作者用大量的篇幅介绍了"软件质量"的基本概念,解释了软件质量的十大属性.这十大质量属性又分为功能性和非功能性两类,功能 ...
- 图片轮播c语言,IOS开发之UIScrollView实现图片轮播器的无限滚动
IOS开发之UIScrollView实现图片轮播器的无限滚动 简介 在现在的一些App中常常见到图片轮播器,一般用于展示广告.新闻等数据,在iOS内并没有现成的控件直接实现这种功能,但是通过UIScr ...
- 谷歌的AI应用开发之道
https://www.toutiao.com/a6718151019873698308/ 全球AI第一大厂,打造AI产品时有何指导思想? 软件+硬件+AI. 没错,这是谷歌CEO皮猜在Google ...
最新文章
- JavaScript之js的一些基础方法
- 关于 调用 JNI JAR java 的说明和注意事项,调用第 靠写不下了
- 二次创业成功人士的19个经验与教训
- class priority_queue 简单介绍
- 如何在vs2010中修改栈的大小
- NOIP练习赛题目6
- python爬虫scrapy连接mongodb_爬虫框架scrapy和数据库MongoDB的结合使用(二)实战
- 微软结束 SolarWinds 事件调查:部分源代码被盗,1000人参与
- EasyUI----增删改查
- 【springssm加载applicationContext.xml文件的一个坑】
- Spring Data + Thymeleaf 3 + Bootstrap 4 实现分页器
- Python 多线程-共享全局变量问题 -args参数 同步的概念
- java实现分时问候,asp实现语音分时问候_asp实例
- html个人主题制作,个人网页制作
- Discuz X 3.4 系列漏洞梳理
- 分享117个PHP源码,总有一款适合你
- ExoPlayer播放器播放MP2音频格式视频无声音加入Ffmpeg软解码功能
- php redis 搜索,一步步实现 Redis 搜索引擎
- 个人介绍 php 怎么说,个人介绍怎么写
- 互联网经济的背后-梅特卡夫效应与双边市场效应