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