cmake一个简单的工程
创建一个工程文件夹hello3,在里面创建一个字文件夹src,把main.cpp、hello.cpp、hello.hpp复制进去。
因为每个文件家里面都要有一个 CMakeists.txt 文件,于是hello3/src文件夹的内容如下:
ADD_EXECUTABLE(hello main.cpp hello.cpp)
工程文件夹hello3里面的内容
PROJECT(HELLO)
ADD_SUBDIRECTORY(src bin)
然后在工程文件夹hello3里面创建子文件夹build,进入该文件夹,运行:
$ cmake ..
-- The C compiler identification is GNU 7.5.0
-- The CXX compiler identification is GNU 7.5.0
-- Check for working C compiler: /usr/bin/cc
-- Check for working C compiler: /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: /usr/bin/c++
-- Check for working CXX compiler: /usr/bin/c++ -- works
-- Detecting CXX compiler ABI info
-- Detecting CXX compiler ABI info - done
-- Detecting CXX compile features
-- Detecting CXX compile features - done
CMake Warning (dev) in CMakeLists.txt:
No cmake_minimum_required command is present. A line of code such as
cmake_minimum_required(VERSION 3.10)
should be added at the top of the file. The version specified may be lower
if you wish to support older CMake versions for this project. For more
information run "cmake --help-policy CMP0000".
This warning is for project developers. Use -Wno-dev to suppress it.
-- Configuring done
-- Generating done
-- Build files have been written to: /media/yeping/Works/demos/d0003-hello/build
再make一下
$ make
Scanning dependencies of target hello
[ 33%] Building CXX object bin/CMakeFiles/hello.dir/main.o
[ 66%] Building CXX object bin/CMakeFiles/hello.dir/hello.o
[100%] Linking CXX executable hello
[100%] Built target hello
然后,在build文件夹内看到一个bin文件夹,里面有我们的目标文件hello。
可见,ADD_SUBDIRECTORY(src bin)中目标文件夹的位置是相对 build 文件夹的,如果改成下面的样子
ADD_SUBDIRECTORY(src ../bin)
目标代码的bin就和src位于文件夹树的同一个级别了。
可以通过 SET 指令重新定义 EXECUTABLE_OUTPUT_PATH 和 LIBRARY_OUTPUT_PATH 变量来指定最终的目标二进制的位置(指最终生成的 hello 或者最终的共享库,不包含编译生成的中间文件)
SET(EXECUTABLE_OUTPUT_PATH ${PROJECT_BINARY_DIR}/bin)
SET(LIBRARY_OUTPUT_PATH ${PROJECT_BINARY_DIR}/lib)
_BINARY_DIR 和 PROJECT_BINARY_DIR 变量,他们指的编译发生的当前目录,如果是内部编译,就相当于PROJECT_SOURCE_DIR 也就是工程代码所在目录,如果是外部编译,指的是外部编译所在目录,也就是本例中的 build 目录。所以,上面两个指令分别定义了:可执行二进制的输出路径为 build/bin 和库的输出路径为 build/lib.
于是,CMakeLists.txt 文件可以更专业地写成下面形式
文件夹 hello3:
PROJECT(HELLO)
ADD_SUBDIRECTORY(src)
文件夹 hello3/src
SET(EXECUTABLE_OUTPUT_PATH ${PROJECT_BINARY_DIR}/../bin)
ADD_EXECUTABLE(hello main.cpp hello.cpp)
在 build 文件夹运行一下,OK!
相关文章
- 一个简单的Android木马病毒的分析
- C# Remoting的一个简单例子
- Visual Studio 2017中使用正则修改部分内容 如何使用ILAsm与ILDasm修改.Net exe(dll)文件 C#学习-图解教程(1):格式化数字字符串 小程序开发之图片转Base64(C#、.Net) jquery遍历table为每一个单元格取值及赋值 。net加密解密相关方法 .net关于坐标之间一些简单操作
- Google Earth Engine APP(GEE) ——一个简单的添加红绿蓝图例的APP
- Google Earth Engine APP(GEE)——一个简单的NDVI/EVI区域时序变化情况chart图表
- Google Earth Engine(GEE)——一个简单的数组
- 一个人,一座城,你到底在乎什么?Python 爬虫告诉你
- 将一个C程序打包
- 创建一个简单的web服务器
- 一个使用 asyncio 协程的网络爬虫(一)
- 从零构建一个简单的 Python 框架
- [WPF] 实现一个很久以前流行的按钮样式
- 面试最让你手足无措的一个问题:你的系统如何支撑高并发?
- 一个简单的int型C++单链表的实现
- 一个简单的GNS3拓扑结构(两台虚拟PC)
- pytorch定义一个简单的神经网络
- 这几个事务案例会回滚吗?最后一个90%的人判断错了...
- oracle在不知道用户密码的时候,怎么样跳转到另外一个用户执行操作后并不影响该用户?
- 推荐一个SAM文件或者bam文件中flag含义解释工具
- 小程序踩过的一个小坑---解析二维码decodeURIComponent() url解码
- 用一个生活的小实例讲讲PID控制
- Ant—使用Ant构建一个简单的Java工程(两)
- 通过myclipse建立一个简单的Hibernate项目(PS:在单元测试中实现数据的向表的插入)