工作环境

  • 系统: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扩展的更多相关文章

  1. CMake入门-03-还是HelloWorld

    工作环境 系统:macOS Mojave 10.14.6 CMake: Version 3.15.0-rc4 Hello,World! 扩展-math 目录里的文件编译成静态库再由 main 函数调用 ...

  2. CMake入门(二)

    CMake入门(二) 最后更新日期:2014-04-25 by kagula 阅读前提:<CMake入门(一)>.Linux的基本操作 环境: Windows 8.1 64bit英文版.V ...

  3. Netty入门之HelloWorld

    Netty系列入门之HelloWorld(一) 一. 简介 Netty is a NIO client server framework which enables quick and easy de ...

  4. CSS3基础入门02

    CSS3 基础入门02 边框相关属性 border-radius 通过这个属性我们可以设置边框圆角,即可以将四个角设置为统一的圆角,也可以单独的设置具体的某一个角的圆角. grammer: borde ...

  5. CMake入门

    CMake入门 CMake是一个跨平台的安装编译工具,可以用简单的语句来描述所有平台的安装(编译过程).他能够输出各种各样的makefile或者project文件,能测试编译器所支持的C++特性,类似 ...

  6. CMake入门教程(转帖)

    本文转自:https://www.cnblogs.com/never--more/p/6921837.html CMake入门教程 参考文献:http://www.ibm.com/developerw ...

  7. Shell入门02

    Shell入门-02 1.重定向 标准输入(<) 标准输出 标准错误重回定向 程序 = 指令 + 数据 命令   变量 在程序中,数据如何输入?又如何输出? 数据输入:键盘 – 标准输入,但是并 ...

  8. CMake 入门实战 | HaHack

    CMake 入门实战 | HaHack undefined

  9. 【网络爬虫入门02】HTTP客户端库Requests的基本原理与基础应用

    [网络爬虫入门02]HTTP客户端库Requests的基本原理与基础应用 广东职业技术学院  欧浩源 1.引言 实现网络爬虫的第一步就是要建立网络连接并向服务器或网页等网络资源发起请求.urllib是 ...

  10. PHP扩展开发--编写一个helloWorld扩展

    为什么要用C扩展 C是静态编译的,执行效率比PHP代码高很多.同样的运算代码,使用C来开发,性能会比PHP要提升数百倍. 另外C扩展是在进程启动时加载的,PHP代码只能操作Request生命周期的数据 ...

随机推荐

  1. CAD2014学习笔记-文字编辑与尺寸标注

    基于 虎课网huke88.com CAD教程 文字与表格 输入文字:TEXT.MTEXT 插入表格:table 新建表格样式 尺寸标注 测量工具:Di.DLI 开启标注:打开工具-工具栏-标注 对齐/ ...

  2. Java编程思想:File类其他方法

    import java.io.File; public class Test { public static void main(String[] args) { MakeDirectories.te ...

  3. 用Python和Pandas以及爬虫技术统计历史天气

    背景 最近在计划明年从北京rebase到深圳去,所以最近在看深圳的各个方面.去年在深圳呆过一段时间,印象最深的是,深圳总是突然就下雨,还下好大的雨.对于我这种从小在南方长大但是后面又在北京呆了2年多的 ...

  4. 看MySQL的参数调优及数据库锁实践有这一篇足够了

    史上最强MySQL参数调优及数据库锁实践 1. 应用优化 1.2 减少对MySQL的访问 1.2.1 避免对数据进行重复检索 1.2.2 增加cache层 1.3 负载均衡 1.3.1 利用MySQL ...

  5. Yarn工作机制

    概述 (0)Mr 程序提交到客户端所在的节点. (1)Yarnrunner 向 Resourcemanager 申请一个 Application. (2)rm将该应用程序的资源路径和Applicati ...

  6. Android的简述3

    Activity的生命周期 Activity类中有许多onXXX形式的函数可以重载,比如onCreate,onStart,onStop,onPause,那么它们的调用顺序到底是如何的呢?下面就通过一个 ...

  7. java 第五章

    java 第五章   while 循环语句 语法:while(循环条件){ //循环操作 循环条件自加: } while循环结构的特点:先判断,在执行.    while   的执行步骤 (1) 声明 ...

  8. spring aop(四)

    直接找到解析aop标签的方法: protected void parseBeanDefinitions(Element root, BeanDefinitionParserDelegate deleg ...

  9. 从零开始react实战:云书签-1 react环境搭建

    总览篇:react 实战之云书签 本篇是实战系列的第一篇,主要是搭建 react 开发环境,在create-react-app的基础上加上如下功能: antd 组件库按需引入 ,支持主题定制 支持 l ...

  10. ASP.NET Core - 实现自定义WebApi模型验证

    Framework时代 在Framework时代,我们一般进行参数验证的时候,以下代码是非常常见的 [HttpPost] public async Task<JsonResult> Sav ...