CMake入门-02-HelloWorld扩展
工作环境
- 系统:macOS Mojave 10.14.6
- CMake: Version 3.15.0-rc4
Hello,World! 扩展-同一目录,多个源文件
(1) 新建 hello 目录,创建文件 CMakeLists.txt、main.cpp、MathFunctions.h、MathFunctions.cpp
$ mkdir hello
$ cd hello
$ touch CMakeLists.txt main.cpp MathFunctions.h MathFunctions.cpp
$ ll
-rw-r--r-- 1 staff staff 124B 8 14 17:19 CMakeLists.txt
-rw-r--r-- 1 staff staff 0B 8 15 16:22 MathFunctions.cpp
-rw-r--r-- 1 staff staff 0B 8 15 16:22 MathFunctions.h
-rw-r--r--@ 1 staff staff 145B 8 14 21:33 main.cpp
(2) 编写 MathFunctions.h
int power(int base, int exponent);
(3) 编写 MathFunctions.cpp
#include <stdio.h>
#include <stdlib.h>
#include "MathFunctions.h"
int power(int base, int exponent) {
int result = base;
int i;
if (exponent == 0) {
return 1;
}
for(i = 1; i < exponent; ++i){
result = result * base;
}
return result;
}
(4) 编写 main.cpp
#include <iostream>
#include "MathFunctions.h"
using namespace std;
int main(int argc, char const *argv[]) {
/* code */
// cout << "Hello,World!" << power(2, 3) << endl;
printf("%s power(2,3)=%d \n", "Hello,World!", power(2, 3));
return 0;
}
(5) 编写 CMakeLists.txt
# CMake 最低版本号要求
cmake_minimum_required(VERSION 3.15.0)
# 项目名
project(hello)
# 查找当前目录下的所有源文件,并将名称保存到 SRC_LIST 变量
# set(SRC_LIST main.cpp MathFunctions.h MathFunctions.cpp)
aux_source_directory(. SRC_LIST)
# 指定生成目标
add_executable(hello ${SRC_LIST})
(6) 编译运行
$ mkdir build
$ cd build
$ pwd
/Users/staff/Desktop/hello/build
$ cmake ..
-- The C compiler identification is AppleClang 10.0.1.10010046
-- The CXX compiler identification is AppleClang 10.0.1.10010046
-- Check for working C compiler: /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/cc
-- Check for working C compiler: /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/cc -- works
-- Detecting C compiler ABI info
-- Detecting C compiler ABI info - done
-- Detecting C compile features
-- Detecting C compile features - done
-- Check for working CXX compiler: /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/c++
-- Check for working CXX compiler: /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/c++ -- works
-- Detecting CXX compiler ABI info
-- Detecting CXX compiler ABI info - done
-- Detecting CXX compile features
-- Detecting CXX compile features - done
-- Configuring done
-- Generating done
-- Build files have been written to: /Users/staff/Desktop/hello/build
$ make
Scanning dependencies of target hello
[ 33%] Building CXX object CMakeFiles/hello.dir/MathFunctions.cpp.o
[ 66%] Building CXX object CMakeFiles/hello.dir/main.cpp.o
[100%] Linking CXX executable hello
[100%] Built target hello
$ ./hello
Hello,World! power(2,3)=8
Hello,World! 扩展-多个目录,多个源文件
(1) 新建 hello 目录,创建文件 CMakeLists.txt、main.cpp、math/MathFunctions.h、math/MathFunctions.cpp
$ mkdir hello
$ cd hello
$ mkdir math
$ touch CMakeLists.txt main.cpp math/MathFunctions.h math/MathFunctions.cpp
$ tree
.
├── CMakeLists.txt
├── main.cpp
└── math
├── MathFunctions.cpp
└── MathFunctions.h
(2) 编写代码
- math/MathFunctions.h
int power(int base, int exponent);
- math/MathFunctions.cpp
#include <stdio.h>
#include <stdlib.h>
#include "MathFunctions.h"
int power(int base, int exponent) {
int result = base;
int i;
if (exponent == 0) {
return 1;
}
for(i = 1; i < exponent; ++i){
result = result * base;
}
return result;
}
- main.cpp
#include <iostream>
// 这里要加上 math 目录
#include "math/MathFunctions.h"
using namespace std;
int main(int argc, char const *argv[]) {
/* code */
// cout << "Hello,World!" << power(2, 3) << endl;
printf("%s power(2,3)=%d \n", "Hello,World!", power(2, 3));
return 0;
}
- CMakeLists.txt
# CMake 最低版本号要求
cmake_minimum_required(VERSION 3.15.0)
# 项目名
project(hello)
# 查找当前目录下的所有源文件,并将名称保存到 SRC_LIST 变量
aux_source_directory(. SRC_LIST)
# 查找 math 目录下的所有源文件,并将名称保存到 MATH_SRC_LIST 变量
aux_source_directory(${PROJECT_SOURCE_DIR}/math MATH_SRC_LIST)
# 指定生成目标
add_executable(hello ${SRC_LIST} ${MATH_SRC_LIST})
(3) 再多学一点
由于多了 math 目录,我们看到 main.cpp 中,#include "math/MathFunctions.h" 也要加上目录。
如果我们不想加 math 目录,直接 #include "MathFunctions.h",操作如下:
- main.cpp
#include <iostream>
// 这里去掉 math 目录
#include "MathFunctions.h"
using namespace std;
int main(int argc, char const *argv[]) {
/* code */
// cout << "Hello,World!" << power(2, 3) << endl;
printf("%s power(2,3)=%d \n", "Hello,World!", power(2, 3));
return 0;
}
- CMakeLists.txt 添加 include_directories
# CMake 最低版本号要求
cmake_minimum_required(VERSION 3.15.0)
# 项目名
project(hello)
# 查找当前目录下的所有源文件,并将名称保存到 SRC_LIST 变量
aux_source_directory(. SRC_LIST)
# 查找 math 目录下的所有源文件,并将名称保存到 MATH_SRC_LIST 变量
aux_source_directory(${PROJECT_SOURCE_DIR}/math MATH_SRC_LIST)
# 添加头文件路径
include_directories(${PROJECT_SOURCE_DIR}/math)
# 指定生成目标
add_executable(hello ${SRC_LIST} ${MATH_SRC_LIST})
相关参考:
CMake 官方网站
CMake 多个源文件-多个目录
联系作者:

CMake入门-02-HelloWorld扩展的更多相关文章
- CMake入门-03-还是HelloWorld
工作环境 系统:macOS Mojave 10.14.6 CMake: Version 3.15.0-rc4 Hello,World! 扩展-math 目录里的文件编译成静态库再由 main 函数调用 ...
- CMake入门(二)
CMake入门(二) 最后更新日期:2014-04-25 by kagula 阅读前提:<CMake入门(一)>.Linux的基本操作 环境: Windows 8.1 64bit英文版.V ...
- Netty入门之HelloWorld
Netty系列入门之HelloWorld(一) 一. 简介 Netty is a NIO client server framework which enables quick and easy de ...
- CSS3基础入门02
CSS3 基础入门02 边框相关属性 border-radius 通过这个属性我们可以设置边框圆角,即可以将四个角设置为统一的圆角,也可以单独的设置具体的某一个角的圆角. grammer: borde ...
- CMake入门
CMake入门 CMake是一个跨平台的安装编译工具,可以用简单的语句来描述所有平台的安装(编译过程).他能够输出各种各样的makefile或者project文件,能测试编译器所支持的C++特性,类似 ...
- CMake入门教程(转帖)
本文转自:https://www.cnblogs.com/never--more/p/6921837.html CMake入门教程 参考文献:http://www.ibm.com/developerw ...
- Shell入门02
Shell入门-02 1.重定向 标准输入(<) 标准输出 标准错误重回定向 程序 = 指令 + 数据 命令 变量 在程序中,数据如何输入?又如何输出? 数据输入:键盘 – 标准输入,但是并 ...
- CMake 入门实战 | HaHack
CMake 入门实战 | HaHack undefined
- 【网络爬虫入门02】HTTP客户端库Requests的基本原理与基础应用
[网络爬虫入门02]HTTP客户端库Requests的基本原理与基础应用 广东职业技术学院 欧浩源 1.引言 实现网络爬虫的第一步就是要建立网络连接并向服务器或网页等网络资源发起请求.urllib是 ...
- PHP扩展开发--编写一个helloWorld扩展
为什么要用C扩展 C是静态编译的,执行效率比PHP代码高很多.同样的运算代码,使用C来开发,性能会比PHP要提升数百倍. 另外C扩展是在进程启动时加载的,PHP代码只能操作Request生命周期的数据 ...
随机推荐
- Bzoj 3126[Usaco2013 Open]Photo 题解
3126: [Usaco2013 Open]Photo Time Limit: 10 Sec Memory Limit: 128 MBSubmit: 335 Solved: 169[Submit] ...
- .Net微信网页开发之JSSDK使用步骤和配置信息timestamp(时间戳),nonceStr(随机串),signature(签名),access_token(接口调用凭据)的生成获取讲解
前言: 因为接下来会有几篇关于微信JS-SDK功能使用的文章,主要会对微信分享,获取设备信息,获取地理位置,微信扫一扫这几个功能进行讲解.而这几个功能都是围绕着微信JS-SDK实现的,首先使用微信JS ...
- 云开发新能力,支持 HTTP 调用 API
今天来上班打开电脑,总感觉微信开发文档哪里有点不太一样,研究了半天原来是云开发又多了神级功能--HTTP API! HTTP API是什么?简单来说就是通过云开发HTTP API,可以不需要通过微信小 ...
- 精美的在线icon
super-tiny-icons(0.2.1)列表 序号 名称 图标 地址 是否使用 1 acast.svg https://cdn.jsdelivr.net/npm/super-tiny-icons ...
- 解决jenkins 发送邮件图片乱码问题
1.在本地mac上测试邮件发送正常 发送邮件内容图片没有乱码 2.公司测试服务器是一台windows2008的系统jmeter + ant jenkins 安装完成后 设置邮件发送格式模板,设置附件 ...
- Java虚拟机知识点【内存】
运行时数据区 程序计数器(Program Counter) 每个线程独占自己的程序计数器.如果当前执行的方式不是native的,那程序计数器保存JVM正在执行的字节码指令的地址,如果是native ...
- 洛谷 P4363 [九省联考2018]一双木棋chess 题解
题目链接:https://www.luogu.org/problemnew/show/P4363 分析: 首先博弈,然后考虑棋盘的规则,因为一个子在落下时它的上面和左面都已经没有空位了,所以棋子的右下 ...
- 洛谷P4994 终于结束的起点 题解
求赞,求回复,求关注~ 题目:https://www.luogu.org/problemnew/show/P4994 这道题和斐波那契数列的本质没有什么区别... 分析: 这道题应该就是一个斐波那契数 ...
- 个人永久性免费-Excel催化剂功能第48波-拆分工作薄内工作表,堪称Excel界的单反
一个工作薄有多个相同类型的工作表,然后想通过批量操作,把每个工作表都另存为一个工作薄文件,这个批量拆分工作薄,绝大多数插件都有此功能,就如懂点VBA的高级用户也常常有点不屑于用插件来完成,自己写向行V ...
- lambda匿名函数,sorted(),filter(),map(),递归函数
1.lambda匿名函数 为了解决一些简单的需求而设计的一句话函数 #计算n的n次方 def func(n): return n**n print(func(10)) f = lambda n: n* ...