Cmake的CMakeLists.txt写法示例
Cmake的CMakeLists.txt写法示例
目录
- 示例一:单文件
- 示例二:多个源文件
- 示例三:将hello.c生成一个库来调用
- 示例四:工程分类文件夹编译
- 示例五:Cmake的install使用
示例一:单文件
- 文件名字为main.cpp,内容如下:
#include <iostream>int main() {printf("Hello World!\n");return 0;
}
- CMakeLists.txt文件内容如下,其中:
a. cmake_minimum_required:对cmake的最低(高)版本的要求。
b. project:cmake工程的名称,不是强制性的,最好加上。
c. set:用来定义变量。
d. add_executable:使用指定的源文件来生成目标可执行文件。
e. message:输出显示信息。
cmake_minimum_required(VERSION 3.21)
project(cmake-demo)set(CMAKE_CXX_STANDARD 14)add_executable(${PROJECT_NAME} main.cpp)message(${PROJECT_NAME})
- CMakeList.txt 文件中,命令名字是不区分大小写的,而参数和变量是大小写相关的。
- 编译时在当前目录新建一个build目录,进行build目录执行:cmake …/ ,产生的临时文件就会在build目录下,不影响源码目录代码。
- 最后在此目录执行make命令生成相应的可执行程序。
a. 注:clion中点击执行可自动生成在cmake-build-debug目录中。
示例二:多个源文件
- hello.h头文件内容如下:
void hello(const char* name); - hello.cpp文件内容:
#include <stdio.h>
#include "hello.h"void hello(const char* name) {printf("Hello my name is %s\n",name);
}
- main.c文件内容如下:
#include <iostream>
#include "hello.h"int main() {printf("Hello World!\n");hello("hello");return 0;
}
- CMakeLists.txt文件:
cmake_minimum_required(VERSION 3.21)
project(cmake-demo)set(CMAKE_CXX_STANDARD 14)
set(SRC_LIST main.cpp hello.cpp hello.h)add_executable(${PROJECT_NAME} ${SRC_LIST})message(${PROJECT_NAME})
示例三:将hello.c生成一个库来调用
- 如果将hello生成成一个库来调用的话只需要在事例二的基础上修改一下CMakeLists.txt文件再进行编译。
- 修改的CMakeLists.txt如下:
a. add_library:指定的源文件生成链接文件添加到工程中。
b. target_link_libraries:将目标文件与库文件进行链接。
cmake_minimum_required(VERSION 3.21)
project(cmake-demo)set(CMAKE_CXX_STANDARD 14)
set(LIB_SRC hello.cpp)
set(SRC_LIST main.cpp)add_library(hello ${LIB_SRC})add_executable(${PROJECT_NAME} ${SRC_LIST})target_link_libraries(${PROJECT_NAME} hello)message(${PROJECT_NAME})
- 与事例二相比,添加了一个新的目标hello库,并将其链接到我们的cmake-demo程序。
- 然后用同样的方法进行cmake和make进行编译。
示例四:工程分类文件夹编译
如果代码量比较大,会将代码分开放置,进行分类,形成分成多个文件夹。
比如main.cpp程序放在app目录下面,hello.cpp和hello.h放在libso文件夹下面。
a. 当前文件夹有一个CMakeLists.txt文件,app和libso文件夹下面也有CMakeLists.txt文件。
首先看app文件夹的CMakeLists.txt。
project(cmake-demo)include_directories(${PROJECT_SOURCE_DIR}/../../libso)set(SRC_LIST main.cpp)
add_executable(${PROJECT_NAME} ${SRC_LIST})
target_link_libraries(${PROJECT_NAME} helloso)message(${PROJECT_NAME})
- 然后看libso文件夹的CMakeLists.txt,其中SHARED表示是生成的动态库,如果把SHARED去掉的话就是生成静态库。
project(helloso)set(LIB_SRC hello.cpp)
add_library(${PROJECT_NAME} SHARED ${LIB_SRC})
- 最外面文件夹的CMakeLists.txt:
cmake_minimum_required(VERSION 3.21)
project(cmake)add_subdirectory(./app)
add_subdirectory(./libso)
- 最后到build目录下执行 cmake …/ 和 make 进行编译。生成目录如下:
a. 注:clion中点击执行可自动生成在cmake-build-debug目录中。
示例五:Cmake的install使用
- cmake中install是将编译好的可执行文件或者生成的库文件放到系统对应的位置,比如说可执行文件直接要放到bin目录下面,so库文件要放到对应的lib目录下面。
- 修改上面例子的CMakeLists.txt文件,编辑完成后编译多了install步骤,这样可以在Linux上面使用该执行文件,执行文件会调用so库。即执行命令为:
cmake ../
make
make install
- app目录修改的CMakeLists.txt在最后一行加上install:
project(cmake-demo)include_directories(${PROJECT_SOURCE_DIR}/../../libso)set(SRC_LIST main.cpp)
add_executable(${PROJECT_NAME} ${SRC_LIST})
target_link_libraries(${PROJECT_NAME} helloso)message(${PROJECT_NAME})install(TARGETS ${PROJECT_NAME} DESTINATION bin)
- libso目录修改的CMakeLists.txt在最后一行加上install:
project(helloso)set(LIB_SRC hello.cpp)
add_library(${PROJECT_NAME} SHARED ${LIB_SRC})install(TARGETS ${PROJECT_NAME} DESTINATION ../lib)
- 解释:
a. install(TARGETS$
{PROJECT_NAME} DESTINATION bin):安装cmake-demo可执行文件到${CMAKE_INSTALL_PREFIX}/bin目录。
b. 可以自行打印CMAKE_INSTALL_PREFIX路径,比如/usr/local,注意bin前面不能有/。
c. 所以执行行文件的路径是/usr/local/bin/,so库文件的安装路径是:/usr/local/…/lib/
d. 此时可以在Linux系统任何目录里执行./cmake-demo
e. 如果执行make install的时候出现错误,加上sudo再次执行。
Cmake的CMakeLists.txt写法示例相关推荐
- Ubuntu下使用cmake结合CmakeLists.txt生成makefile文件并进行编译
转自1:https://www.cnblogs.com/cv-pr/p/6206921.html 转自2:https://blog.csdn.net/qqwangfan/article/details ...
- 【CMAKE系列】cmake中CMakeLists.txt脚本的常用语法
在不同的平台编译的时候,会用到一些系统内置的变量,比如操作系统名称,版本号之类: CMAKE_SYSTEM:系統全名,如 "Linux-2.4.22″,"FreeBSD-5.4-R ...
- GCC,Clang,make,cmake,makefile,CMakeLists.txt的概念
gcc和clang gcc和clang是两个不同的编译器 make和cmake make和cmake是搭配编译器来方便用户进行多文件编译而发明的工具 makefile make工具相当于一个智能的批处 ...
- 【CMake】CMakeLists.txt的超傻瓜手把手教程(附实例源码)
新手写CMakeLists.txt简直就是实力劝退,各种命令让很多人头大,如何写一个最基础的CMakeLists.txt呢?本文从一个实例出发,教你编写的基本流程. CMakeLists.txt的基本 ...
- Cmake之CMakeLists.txt
我们知道makefile是在Linux编译c或者c++代码的时候的一种脚本文件,但是每一个功能都要写一个makefile文件,这样如果这个工程很大,而且相关性比较强的话,makefile的书写就会变得 ...
- 多目录cmake工程 CmakeLists.txt编写
实现类似于vs中工程的CMakeLists.txt的编写.功能为main.cpp调用hello.cpp 的hello()函数,world.cpp的world()函数.使用自动添加多目录下的文件 1.工 ...
- “cmake 点点”表示在上一级目录(CMakeLists.txt所在目录)编译
CMake学习(一)_福尔摩斯帅双的博客-CSDN博客 在 linux 平台下使用 CMake 生成 Makefile 并编译的流程如下: 编写 CMake 配置文件 CMakeLists.txt . ...
- Cmake知识----编写CMakeLists.txt文件编译C/C++程序
1.CMake编译原理 CMake是一种跨平台编译工具,比make更为高级,使用起来要方便得多.CMake主要是编写CMakeLists.txt文件,然后用cmake命令将CMakeLists.txt ...
- gcc、clang、make、cmake、makefile、CMakeLists.txt概念学习
说明 编译器是翻译代码为计算机语言的一个工具,我们平时写的代码如果想在某个特定的计算机上执行(计算机的cpu构架不同),就需要编译器来对代码进行编译汇编链接,而汇编和链接的过程对于每个不同的平台上过程 ...
最新文章
- 遂宁专业计算机学校,遂宁计算机专业中职学校哪家强
- Entity Framework技巧系列之十一 - Tip 42 - 45
- c#中datareader中HasRows属性和Read方法的区别
- 19、Java Swing JToolBar:工具栏组件
- centos iptables
- java学习(165):inetaddress和inetsocketaddress
- boost库linux编译安装
- LeetCode 759. 员工空闲时间(排序)
- [root@dg1 ~]# su - grid ---切换到grid用户
- android 图片拍照,Android获取图片拍照时间
- vuejs 和 element 搭建的一个后台管理界面
- java主函数_《左手 Java 右手 Python 》之 Java 的安装与初识(1)
- The Apache Tomcat Native library which allows optimal performance in production environments wasn
- 使用golang链接达梦数据库
- redisson + CacheManager缓存管理
- bert系列模型继续预训练(Pytorch)
- mybatis错误:Could not resolve resource location pattern [classpath:com/demon/user/mapper/*.xml]: class
- coq形式化验证学习进阶
- 原来路由器也属于消耗品
- 2023 华为 Datacom-HCIE 真题题库 06/12--含解析
热门文章
- Tomcat部署时没有项目
- 记一次重写easyui的datetimebox控件的小片段
- AsyncTask实现断点续传
- 【java】Java异常处理总结
- row_number() over (partition by....order by...)用法 分组排序
- 牛客 - Elo mountains(AC自动机+可持久化数组优化)
- HYSBZ - 1208 宠物收养所(Splay)
- CodeForces - 858D Polycarp's phone book(字典树/map)
- 计算机python技术基础知识点_python基础--相关计算机基础知识
- EOJ_1007_环形双向链表