cmake的学习

cmake的学习

在项目中,因为有很多的代码许要编译,仅仅使用g++的话会不太方便,所以会使用cmake来进行编译和管理源代码。

step1

先写一段helloWorld.cpp的代码


#include <iostream>

using namespace std;

int main(int argc, char** argv){

    cout<<"Hello World!!!" <<endl;
    return 0;

}


step2

写一个CMakeLists.txt文件

cmake_minimum_required(VERSION 2.8)

project(HelloWorld)

add_executable(helloWorld helloWorld.cpp)
~                                                          

其中的意思是声明要求的cmake的最低version, 声明一个cmake工程,添加一个可执行程序,其中可执行程序的程序名叫helloWorld 源代码文件叫helloWorld.cpp.

CMakeLists.txt 文件用于告诉cmake我们要对这个目录下的文件做什么事情。

step3

当前的文件目录结构如下

.
├── CMakeLists.txt
└── helloWorld.cpp


为了方便,会建立一个build文件目录,这样可以把编译的东西都放在里面,便于管理

依次执行下面的命令

mkdir build
cd build
cmake ..
make 

然后目录结构就变成了

.
├── build
│   ├── CMakeCache.txt
│   ├── CMakeFiles
│   │   ├── 3.5.1
│   │   │   ├── CMakeCCompiler.cmake
│   │   │   ├── CMakeCXXCompiler.cmake
│   │   │   ├── CMakeDetermineCompilerABI_C.bin
│   │   │   ├── CMakeDetermineCompilerABI_CXX.bin
│   │   │   ├── CMakeSystem.cmake
│   │   │   ├── CompilerIdC
│   │   │   │   ├── a.out
│   │   │   │   └── CMakeCCompilerId.c
│   │   │   └── CompilerIdCXX
│   │   │       ├── a.out
│   │   │       └── CMakeCXXCompilerId.cpp
│   │   ├── cmake.check_cache
│   │   ├── CMakeDirectoryInformation.cmake
│   │   ├── CMakeOutput.log
│   │   ├── CMakeTmp
│   │   ├── feature_tests.bin
│   │   ├── feature_tests.c
│   │   ├── feature_tests.cxx
│   │   ├── helloWorld.dir
│   │   │   ├── build.make
│   │   │   ├── cmake_clean.cmake
│   │   │   ├── CXX.includecache
│   │   │   ├── DependInfo.cmake
│   │   │   ├── depend.internal
│   │   │   ├── depend.make
│   │   │   ├── flags.make
│   │   │   ├── helloWorld.cpp.o
│   │   │   ├── link.txt
│   │   │   └── progress.make
│   │   ├── Makefile2
│   │   ├── Makefile.cmake
│   │   ├── progress.marks
│   │   └── TargetDirectories.txt
│   ├── cmake_install.cmake
│   ├── helloWorld
│   └── Makefile
├── CMakeLists.txt
└── helloWorld.cpp


可以看到可执行文件生成了。这时候 ./helloWorld就会出现结果。

使用库

在一个工程中,并不是所有的代码都会编译成可执行文件,只有带有main函数的文件才会生成可执行程序,而另一些代码,我们只想把它们打包成一个东西,代其他程序调用,这个东西就是库。

库往往是许多算法,程序的集合,接下来学习如何使用cmake 来生成库,并且使用库中的函数. 先写一个libHelloWorld.cpp

#include <iostream>

using namespace std;

void printHello(){

    cout<<"Hello World!"<<endl;
}

CMakeLists.txt中添加

add_library(hello_shared SHARED libHelloWorld.cpp)

注意加了SHARED之后生成的是共享库,如果不加的话生成的是静态库,在linux中库文件就这两种,前者是.so结尾,后者是.a结尾,二者的差别在于静态库每次被调用都会生成一个副本,而共享库则只有一个副本,更省空间。

为了让别人和自己使用这个库,需要提供一个头文件,说明这些库里都有些什么,因此对于库的使用者,只要拿到了头文件和库文件,就可以调用这个库了.下面是libhello的头文件

#ifndef LIBHELLOWORLD_H_
#define LIBHELLOWORLD_H_

void printHello();
#endif

接下来就可以调用了,写一个函数

#include "libHelloWorld.h"

int main(int argc, char** argv){

    printHello();
    return 0;
}
~      

然后在编译的时候指定链接到刚才使用的库上

target_link_libraries(useHello hello_shared)

打赏,谢谢~~

取消

感谢您的支持,我会继续努力的!

扫码支持
扫码打赏,多谢支持~

打开微信扫一扫,即可进行扫码打赏哦