【原创】CMake基础知识

本文详细介绍CMake的使用方法,包括创建可执行文件、使用变量、生成静态库和动态库、源文件管理、库文件和exe文件目录配置等内容,适合初学者和进阶者学习。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

目录

 

Hello CMake

使用变量

生成并使用静态库库

源文件分多个文件夹保存

库文件和exe文件单独制定存放目录

生成动态库


Hello CMake

创建hello_cmake.cpp

#include<stdlib.h>
#include<stdio.h>
#include<string.h>
#include<sys/types.h>
#include<sys/stat.h>

#include<iostream>
#include<string>
#include<deque>
#include<map>
#include<vector>
#include<list>

using namespace std;

int main()
{
	cout<<"hello cmake"<<endl;

}

创建CMakeLists.txt

# 指定cmake的最低版本
cmake_minimum_required(VERSION 2.6) 
 
# project命令指定工程名称,非必须设定
project(HELLO)

# add_executable命令指定生成可执行程序hello_cmake
add_executable(hello_cmake hello_cmake.cpp)

执行编译

# 创建build文件夹, 生成中间产物与源代码分离
mkdir build
cd build

# 生成makefile文件
cmake ../
make
./hello_cmake

project命令指定工程名称,同时会生成两个变量,PROJECT_BINARY_DIR(二进制文件保存路径)、PROJECT_SOURCE_DIR(源文件保存路径)。使用message命令输出两个变量

# 指定cmake的最低版本
cmake_minimum_required(VERSION 2.6)  
# project命令指定工程名称,非必须设定
project(hello_cmake)
# 输出源文件路径
message(${PROJECT_SOURCE_DIR})
# 输出二进制文件保存路径
message(${PROJECT_BINARY_DIR})

# add_executable命令指定生成可执行程序hello_cmake
add_executable(hello_cmake hello_cmake.cpp)

使用变量

cmake_minimum_required(VERSION 2.6)
project(cmake_variable)
set(SRC_LIST hello.cpp main.cpp)
add_executable(cmake_variable ${SRC_LIST})

set命令定义变量SRC_LIST,它的取值为“hello.cpp main.cpp”,注意两个文件使用空格分隔

变量的引用方法是${变量名称}

生成并使用静态库库

add_library()生成动态库文件

target_link_libraries()指定连接的动态库

cmake_minimum_required(VERSION 2.6)
project(HELLO)
# 指定生成静态库和以来的源文件
add_library(libhello hello.cpp)
add_executable(hello main.cpp)
#指定需要连接的库文件
target_link_libraries(hello libhello)

注意:

  • target_link_librarries指定需要连接动态库时直接使用库文件名
  • add_library()指定生成库文件,add_executable()指定生成可执行文件,这两个命令的第一个参数都是指定需要编译生成的target,这两个target是不能重名的。另外add_library()指定target,但是输出的实际名称是“lib#target名称#.a”,所以这是后生成库文件名称就变成了 liblibhello.a,这个不符合库文件的命名文件,那怎么办呢?我们可以通过set_target_properties()指定输出名称
cmake_minimum_required(VERSION 2.6)
project(HELLO)

# 指定生成静态库和以来的源文件
add_library(libhello hello.cpp)
set_target_properties(libhello PROPERTIES OUT_NAME 'hello')

##指定生成可执行文件,和需要连接的库文件
add_executable(hello main.cpp)
target_link_libraries(hello libhello)

源文件分多个文件夹保存

这里嘉定main.cpp放在src字母下, hello.cpp放在libhello目录下,这时需要准备三个CMakeLists.txt

根目录下的CMakeLists.txt,通过add_subdirectory()告诉cmake到src子目录下搜索CMakeLists.txt

project(HELLO)
add_subdirectory(src bin)
add_subdirectory(hellosrc lib)

注意:add_subdirectory(param1 param2),如果只有param1时,生成目录名称和param1相同,如果存在param2则生成目录名为param2,这里在build目录下分别生成 bin子目录和lib子目录

libhello子目录下的CMakeLists.txt

set(LIB_SRC hello.cpp)
add_library(libhello ${LIB_SRC})
set_target_properties(libhello PROPERTIES TARGET_NAME 'hello')

src目录下的CMakeLists.txt

include_directories()  指定hello.h头文件的目录

target_link_libraries() 指定连接库文件target

include_directories(${PROJCET_SOURCE_DIR}/libhello)
set(APP_SRC main.cpp)
add_excutable(hello ${APP_SRC})
target_link_libraries(hello libhello)

这样编译生成的临时文件也是分src/libhello目录放置的。

库文件和exe文件单独制定存放目录

虽然上一节最后讲到如何修改库文件和可执行文件的存放目录,但是生成.o等临时文件也会放在这些目录下。这里通过设定内置变量EXECUTABLE_OUTPUT_PATH制定exe文件的存放目录,设定内置变量LIBRARY_OUTPUT_PATH制定库文件的存放目录。

修改src/CMakeLists.txt

include_directories(${PROJCET_SOURCE_DIR}/libhello)
set(APP_SRC main.cpp)

#设定可执行文件的保存目录
set(EXECUTABLE_OUTPUT_PATH ${PROJECT_BINARY_DIR}/bin)
add_excutable(hello ${APP_SRC})
target_link_libraries(hello libhello)

修改libhello/CMakeLists.txt

set(LIB_SRC hello.cpp)

set(LIBRARY_OUTPUT_PATH ${PROJECT_BINARY_DIR}/lib)
add_library(libhello ${LIB_SRC})
set_target_properties(libhello PROPERTIES OUTPUT_NAME  hello)

生成动态库

生成动态库,只需要在add_library()命令中使用shared关键字

set(LIB_SRC hello.cpp)

set(LIBRARY_OUTPUT_PATH ${PROJECT_BINARY_DIR}/lib)
# 添加shared关键字
add_library(libhello SHARED ${LIB_SRC})
set_target_properties(libhello PROPERTIES OUTPUT_NAME  hello)

参考链接:https://blog.csdn.net/Simbazzia/article/details/80584283

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值