咱们晓得makefile是在Linux编译c或者c++代码的时候的一种脚本文件,然而每一个性能都要写一个makefile文件,这样如果这个工程很大,而且相关性比拟强的话,makefile的书写就会变得绝对繁琐,更要命的是如果当前须要增加新的性能或者是新人须要批改性能的话,看起来就会特地麻烦;因为介于此,cmake的呈现就是为了解决这样的问题,cmake的入门相当容易,而且治理也特地不便简略,那咱们开始吧。
cmake的所有语句都写在一个CMakeLists.txt的文件中,CMakeLists.txt文件确定后,间接应用cmake命令进行运行,然而这个命令要指向CMakeLists.txt所在的目录,cmake之后就会产生咱们想要的makefile文件,而后再间接make就能够编译出咱们须要的后果了。更简略的解释就是cmake是为了生成makefile而存在,这样咱们就不须要再去写makefile了,只须要写简略的CMakeLists.txt即可。
cmake的执行流程很简略,咱们的重点是如何编写CMakeLists.txt文件呢,咱们通过例子来学习cmake的语法。
例子从这篇文章中学习http://blog.csdn.net/dbzhang8...,大抵如下:
1、一个单文件的简略的例子
文件名字为main.c 内容如下:
#include <stdio.h>int main(){ printf("Hello World Test!\n"); return 0;}
CMakeLists.txt文件内容如下:
project(hello_jelly)set(APP_SRC main.c)add_executable(${PROJECT_NAME} main.c) #print messagemessage(${PROJECT_SOURCE_DIR})
解释代码:
第一个行project不是强制性的,最好加上,这会引入两个变量:
HELLO_BINARY_DIR, HELLO_SOURCE_DIR
同时也会定义两个等价的变量:
PROJECT_BINARY_DIR, PROJECT_SOURCE_DIR
内部编译要时刻辨别这两个变量对应的目录
能够通过message进行输入
message(${PROJECT_SOURCE_DIR})
set 命令用来设置变量
add_exectuable 通知工程生成一个可执行文件。
add_library 则通知生成一个库文件。
CMakeList.txt 文件中,命令名字是不辨别大小写的,而参数和变量是大小写相干的。
而后将以上两个文件放在对立目录上面,留神编译产生时候分为两种,一种是间接在以后源码目录执行cmake命令#cmake ./,然而这样会在当前目录下产生很多临时文件和目录,另一种形式就是在当前目录新建一个build目录,而后我门进入到build目录,执行命令cmake ../,这样产生的所有临时文件都会生成在build目录下,而不影响源码目录的代码,此处咱们采纳第二种办法。咱们进入到build目录,执行命令#cmake ../,而后在当前目录能够看到文件如下
drwxrwxr-x 3 zqq zqq 4096 9月 28 17:12 CMakeFiles-rw-rw-r-- 1 zqq zqq 993 9月 28 17:12 cmake_install.cmake-rw-rw-r-- 1 zqq zqq 5479 9月 28 17:12 Makefile
最初再在此目录执行make即可生成相应的可执行程序。
2、多个源文件的操作
hello.h头文件内容如下
#ifndef JELLYHELLO#define JELLYHELLOvoid hello(const char* name);#endif
hello.c文件内容
#include <stdio.h>#include "hello.h" void hello(const char* name){ printf("Hello my name is %s\n",name);}
main.c文件内容如下
#include <stdio.h>#include "hello.h" int main(){ printf("Hello World Test!\n"); hello("jelly"); return 0;}
而后是CMakeLists.txt文件
project(hello_jelly)set(APP_SRC main.c hello.c)add_executable(${PROJECT_NAME} ${SRC_LIST}) #print messagemessage(${PROJECT_SOURCE_DIR})
而后保留应用下面的办法进行cmake和make,就能够生成须要的可执行文件
3、将hello.c生成一个库来调用
如果将hello生成成一个库来调用的话只须要在2的根底上批改一下CMakeLists.txt文件再进行编译即可
批改的CMakeLists.txt如下:
project(hello_jelly)set(LIB_SRC hello.c)set(APP_SRC main.c)add_library(hello ${LIB_SRC})add_executable(${PROJECT_NAME} ${APP_SRC})target_link_libraries(${PROJECT_NAME} hello) #print messagemessage(${PROJECT_NAME})
相比之下,咱们只是增加了一个新的指标hello库,并将其链接到咱们的demo程序
而后同样的办法进行cmake和make进行编译
4、工程分类文件夹编译
在后面,咱们胜利的应用了库,然而源代码都是在同一个门路上面,这样如果到时候代码量比拟大的话,可能就会分类,造成多个文件夹,这样咱们须要把代码分凋谢,此时咱们须要些三个CMakeLists.txt文件,目录构造如下
drwxrwxr-x 2 zqq zqq 4096 9月 28 17:32 appdrwxrwxr-x 5 zqq zqq 4096 9月 28 17:12 build-rw-rw-r-- 1 zqq zqq 487 9月 27 14:42 CMakeLists.txtdrwxrwxr-x 2 zqq zqq 4096 9月 28 17:19 libso
咱们将main.c程序放在app目录上面,hello.c hello.h放在libso文件夹上面,而后该文件夹有一个CMakeLists.txt文件,app和libso文件夹上面也有CMakeLists.txt文件,这样就有三个CMakeLists.txt文件了,那么咱们接下来来编辑这个三个文件吧。
首先是app文件夹的CMakeLists.txt
project(hello_jelly)include_directories(${PROJECT_SOURCE_DIR}/../libso) set(APP_SRC main.c)add_executable(${PROJECT_NAME} main.c)target_link_libraries(${PROJECT_NAME} helloso) message(${PROJECT_SOURCE_DIR})
而后是libso文件夹的CMakeLists.txt,其中SHARED 示意是生成的动静库,如果把SHARED去掉的话就是生成动态库
project(helloso) set(LIB_SRC hello.c)add_library(${PROJECT_NAME} SHARED ${LIB_SRC})
最初是里面那个和app在同一目录下的CMakeLists.txt
cmake_minimum_required (VERSION 3.2)project(jelly_cmake) add_subdirectory(./app)add_subdirectory(./libso)
其示意咱们要到./app和./libso文件夹上面去寻找Cmake文件而后进行编译
最初咱们在build目录上面去执行下面的命令编译即可编译出咱们须要的可执行文件。
#cmake ../#make
5、Cmake的install简略应用
我的了解cmake中的install其实就是一个将编译好的可执行文件或者是生成的库文件将它放到零碎对应的地位,比如说可执行文件间接要放到bin目录上面,so库文件要放在对应的lib目录上面,我在下面的例子的根底上批改CMakeLists.txt文件,编辑实现后编译的步骤如下,就是多了个install步骤,这样咱们就能够在Linux下面应用该执行文件,执行文件会去调用so库。
#cmake ../#make#make install
app目录批改的CMakeLists.txt如下:只是在之前的根底上加了最初install一行
project(hello_jelly)include_directories(${PROJECT_SOURCE_DIR}/../libso) set(APP_SRC main.c)add_executable(${PROJECT_NAME} main.c)target_link_libraries(${PROJECT_NAME} helloso) message(${PROJECT_SOURCE_DIR}) install(TARGETS ${PROJECT_NAME} DESTINATION bin)
libso目录批改的CMakeLists.txt如下:只是在之前的根底上加了最初install一行
project(helloso) set(LIB_SRC hello.c)add_library(${PROJECT_NAME} SHARED ${LIB_SRC}) install(TARGETS ${PROJECT_NAME} DESTINATION ../lib)
在此须要解释下这个门路问题,install(TARGETS ${PROJECT_NAME} DESTINATION bin)这句话的意思是装置TARGERS hello_jelly这个可执行文件到${CMAKE_INSTALL_PREFIX}/bin目录上面,我测试打印我的${CMAKE_INSTALL_PREFIX}门路是/usr/local门路,bin后面不能有/,否则会是绝对路径,它不再会去获取${CMAKE_INSTALL_PREFIX}门路,
综上所述,可执行文件装置的门路是:
/usr/local/bin/
so库文件的装置门路是:
/usr/local/../lib/
最初执行那三个命令就完了,此时你能够在你的Linux零碎外面的任何目录执行./hello_jelly
注:如果执行make install的时候呈现谬误,能够加上sudo再次执行试试!!!
————————————————
版权申明:本文为CSDN博主「jelly_lzy」的原创文章,遵循CC 4.0 BY-SA版权协定,转载请附上原文出处链接及本申明。
原文链接:https://blog.csdn.net/u013896...