700字范文,内容丰富有趣,生活中的好帮手!
700字范文 > Cmake的CMakeLists.txt写法示例

Cmake的CMakeLists.txt写法示例

时间:2019-04-26 07:57:28

相关推荐

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 ../makemake 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再次执行。

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。