CLion+CMake编写C++程序

CLion+CMake编写C++程序,第1张

当在mac系统下编写c++程序时候,一般需要使用Xcode。如果不想装Xcode如何编译、运行程序呢?

一种方法是编写makefile文件,用makefile文件管理程序脚本之间的相互依赖关系

一、CMake是一种跨平台编译工具,比make更为高级。CMake主要是编写CMakeLists.txt文件,然后用cmake命令将CMakeLists.txt文件转化为make所需要的makefile文件,最后用make命令编译源码生成可执行程序

二、cmake  指向CMakeLists.txt所在的目录,例如cmake .. 表示CMakeLists.txt在当前目录的上一级目录

cmake会生成很多中间文件,所以建议新建一个文件夹存放,分四个步骤:

1、mkdir bulid  //新建文件夹存放编译的中间文件

2、cd bulid //进入bulide文件夹

3、cmake .. //因为CMakeLists.txt文件在当前目录的外面,所以cmake命令需要使用cmake ..

4、make //make命令根据makefile文件编译源码,在bulid目录下生成一个可执行文件,运行获取结果

CMakeLists.txt主要包含以上的7个步骤:

#1.cmake verson,指定cmake版本

cmake_minimum_required(VERSION 3.13)

#2.project name,指定项目的名称,一般和项目的文件夹名称FirstProject对应

PROJECT(FirstProject)

#3.head file path,头文件目录

INCLUDE_DIRECTORIES()

#4.source directory,源文件目录

AUX_SOURCE_DIRECTORY(src DIR_SRCS)

#5.set environment variable,设置环境变量,编译用到的源文件全部都要放到这里,否则编译能够通过,但是执行的时候会出现各种问题,比如"symbol lookup error xxxxx , undefined symbol"

SET(TEST_MATH)

#6.add executable file,添加要编译的可执行文件

ADD_EXECUTABLE(${PROJECT_NAME} ${TEST_MATH})

#7.add link library,添加可执行文件所需要的库(命名规则:lib+name+.so),就添加该库的名称

TARGET_LINK_LIBRARIES(${PROJECT_NAME} m)

1.外部编译的一个实例:

对于 cmake,内部编译在CMake(一)已经演示过了,它生成了一些无法自动删除的中间文件,所以, 引出了我们对外部编译的探讨,外部编译的过程如下:

1,首先,请清除t1目录中除main.c CmakeLists.txt之外的所有中间文件,最关键 的是 CMakeCache.txt。

2,在t1目录中建立build 目录,当然你也可以在任何地方建立build目录,不一定必 须在工程目录中。

3,进入build目录,运行cmake ..(注意,..代表父目录,因为父目录存在我们需要的 CMakeLists.txt,如果你在其他地方建立了build目录,需要运行cmake <工程的全 路径>),查看一下 build 目录,就会发现了生成了编译需要的 Makefile 以及其他的中间 文件.

4,运行 make 构建工程,就会在当前目录(build 目录)中获得目标文件 hello。

上述过程就是所谓的 out-of-source 外部编译,一个最大的好处是,对于原有的工程没 有任何影响,所有动作全部发生在编译目录。通过这一点,也足以说服我们全部采用外部编 译方式构建工程。

贴图(tree图如下)

目录结构是: CMakeLIsts.txt 放在工程的顶层目录下,而建立build, 然后cmake 生成的中间文件会自动放到build 目录下,Cmake的中间文件不能通过make clean 自动删除,这种方式手动删除的时候比较便利。

2.建立src 目录,把所有的source 文件都挪到src 下面去, bin 里面的文件则是自动生成的。

CMakeLists.txt 文件如下:

编译:

这里要注意的是ADD_SUBDIRECTORY,如果把source 移入到Src,然后编译的时候会出错,说无法再src下面找到CMakeLIsts.txt文件,这里的处理是用SET()方法指定了source 的路径才过的,而ADD_SUBDIRECTORY暂时没有用。

**1)以下是一些说明,还需要慢慢体会用法的精妙之处。

ADD_SUBDIRECTORY 指令ADD_SUBDIRECTORY(source_dir [binary_dir] [EXCLUDE_FROM_ALL])

这个指令用于向当前工程添加存放源文件的子目录,并可以指定中间二进制和目标二进制存 放的位置。EXCLUDE_FROM_ALL 参数的含义是将这个目录从编译过程中排除,比如,工程 的 example,可能就需要工程构建完成后,再进入 example 目录单独进行构建(当然,你 也可以通过定义依赖来解决此类问题)。

**2) 关于要从src 中找CMakeLists.txt 我一直觉得比较反人类,看了一些成熟项目的make 结构,src 下面也没有放这个文件。但为什么参考资料里面没有提要做SET的设定,或许是cmake 的版本不同?

加了最后两行

形成的工程文件如下,静态库.a在lib中生成。

同理可以生成动态库,省略,

source code:

https://github.com/xieheng0915/eosapps/tree/master/t2

追记:

cmake 的整合,以及其他功能还是在以后使用中再看,以下是一些参考的link:

https://stackoverflow.com/questions/41319476/cmake-add-subdirectory-not-invoking-the-child-cmakelists-txt

http://derekmolloy.ie/hello-world-introductions-to-cmake/


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/yw/12190067.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-21
下一篇 2023-05-21

发表评论

登录后才能评论

评论列表(0条)

保存