cmake使用

本文详细介绍了如何使用CMake进行项目构建,包括设置CMakeLists.txt,构建静态和共享库,以及链接这些库到可执行文件。内容涵盖cmake基本语法,环境为wslUbuntu20.04,同时提供了不同场景下的CMakeLists.txt示例。

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

目录

一、目的

二、环境

三、文件结构

四、文件详情

1.note

2.顶层CMakeLists.txt

3.src下CMakeLists.txt

4.build_lib下CMakeLists.txt

5.src_static_lib下CMakeLists.txt

6.src_shared_lib下CMakeLists.txt

7.include下fun1.h

8.include下fun2.h

9.src下fun1.c

10.src下fun2.c

11.src下main.c

12.src_static_lib下main.c

13.src_shared_lib下main.c

五、演示

1.使用cmake生成makefile

2.使用make编译

3.运行


一、目的

1.cmake基本语法
2.cmake使用源文件构建项目
3.cmake构建静态链接库和共享库
4.cmake使用静态链接库构建项目
5.cmake使用动态链接库构建项目

二、环境

wsl unbuntu20.04

三、文件结构

 

 

四、文件详情

1.note

# cmake版本要求
cmake_minimum_required(VERSION 3.0)

# CMakeLists.txt项目,每个CMakeLists.txt可有一个project
project(demo)

# cmake内部变量CMAKE_HOME_DIRECTORY --顶层CMakeLists.txt所在文件夹

# cmake内部变量PROJECT_SOURCE_DIR   --当前CMakeLists.txt所在文件夹

# 设置变量
set(SRC_LIST ./main.c)

# 取变量
${SRC_LIST}

# 控制cmake变量
option(MYOPTION "this is for cmakelist.txt case" ON)
if (MYOPTION)
message("MYOPTION is ON")
else()
message("MYOPTION is OFF")
endif()

# 搜索文件夹,填充变量
aux_source_directory(. VARIABLE)

# 搜索文件;满足条件,填充变量
file(GLOB SRCS ./src/*.cpp)
file(GLOB HEADS ./include/*.hpp)

# 添加编译选项
add_compile_options(-Wall)

# 指定c++标准
set(CMAKE_CXX_STANDARD 11)      #方法一
cmake . -DCMAKE_CXX_STANDARD=11 #方法二
add_compile_options(-std=c++11) #方法三

# 添加cmake子目录,该目录下应当有CMakeLists.txt
add_subdirectory(build)

# .目录下的源文件添加到变量SRC_LIST
aux_source_directory(. SRC_LIST)    #等价于 set(SRC_LIST ./main.c)

# 添加包含目录
include_directories(path1 path2)

# 指定可执行文件输出路径(可执行文件或动态库)
set(EXECUTABLE_OUTPUT_PATH ./bin)

# 设置库的输出路径(动态或静态库)
set(LIBRARY_OUTPUT_PATH /lib)

# 添加生成库,库将作为生成目标
add_library(lib_name type source_file)   #如add_library(libfun1_shared SHARED fun1.c)、add_library(libfun1_static STATIC fun1.c)

# 查找动态库到变量MYLIBS    !LIBS是内部变量!
find_library(MYLIBS libname path)   #如find_libraries(MYLIBS lib.so path) find_libraries(MYLIBS lib.a path)

# 添加源文件到可执行文件
add_executable(main $(SRC_LIST))

# 链接静态库;动态库(可执行文件)也可用
target_link_libraries(main MYLIBS)

2.顶层CMakeLists.txt

cmake_minimum_required(VERSION 2.8)

project(demo)

message("CMAKE_HOME_DIRECTORY=${CMAKE_HOME_DIRECTORY},PROJECT_NAME=${PROJECT_NAME},PROJECT_SOURCE_DIR=${PROJECT_SOURCE_DIR}")

add_subdirectory(src)   # 使用源文件构建项目
add_subdirectory(build_lib) # 构建静态库和共享库
add_subdirectory(src_static_lib)    # 使用静态库构建项目
add_subdirectory(src_shared_lib)    # 使用共享库构建项目

3.src下CMakeLists.txt

project(main)

message("CMAKE_HOME_DIRECTORY=${CMAKE_HOME_DIRECTORY},PROJECT_NAME=${PROJECT_NAME},PROJECT_SOURCE_DIR=${PROJECT_SOURCE_DIR}")

aux_source_directory(. SRC_LIST)

include_directories(../include)

add_executable(main ${SRC_LIST})

set(EXECUTABLE_OUTPUT_PATH ../bin)

4.build_lib下CMakeLists.txt

project(build_lib)

message("CMAKE_HOME_DIRECTORY=${CMAKE_HOME_DIRECTORY},PROJECT_NAME=${PROJECT_NAME},PROJECT_SOURCE_DIR=${PROJECT_SOURCE_DIR}")

set(LIB_SRC1 ${CMAKE_HOME_DIRECTORY}/src/fun1.c)
set(LIB_SRC2 ${CMAKE_HOME_DIRECTORY}/src/fun2.c)

add_library(libfun1_static STATIC ${LIB_SRC1})
add_library(libfun2_shared SHARED ${LIB_SRC2})

set(LIBRARY_OUTPUT_PATH ${CMAKE_HOME_DIRECTORY}/lib)

set_target_properties(libfun1_static PROPERTIES OUTPUT_NAME "fun1")
set_target_properties(libfun2_shared PROPERTIES OUTPUT_NAME "fun2")

5.src_static_lib下CMakeLists.txt

project(static)

message("CMAKE_HOME_DIRECTORY=${CMAKE_HOME_DIRECTORY},PROJECT_NAME=${PROJECT_NAME},PROJECT_SOURCE_DIR=${PROJECT_SOURCE_DIR}")

include_directories(${CMAKE_HOME_DIRECTORY}/include)

set(EXECUTABLE_OUTPUT_PATH ${CMAKE_HOME_DIRECTORY}/bin)

set(SRCS ./main.c)

find_library(STATIC_LIBS libfun1.a ${CMAKE_HOME_DIRECTORY}/lib)
message("STATIC_LIBS=${STATIC_LIBS}")

add_executable(static ${SRCS})

target_link_libraries(static ${STATIC_LIBS})

6.src_shared_lib下CMakeLists.txt

project(shared)

message("CMAKE_HOME_DIRECTORY=${CMAKE_HOME_DIRECTORY},PROJECT_NAME=${PROJECT_NAME},PROJECT_SOURCE_DIR=${PROJECT_SOURCE_DIR}")

include_directories(${CMAKE_HOME_DIRECTORY}/include)

set(EXECUTABLE_OUTPUT_PATH ${CMAKE_HOME_DIRECTORY}/bin)

set(SRCS ./main.c)

# 添加动态链接库到变量LIBS
find_library(SHARED_LIBS libfun2.so ${CMAKE_HOME_DIRECTORY}/lib)
message("SHARED_LIBS=${SHARED_LIBS}")

add_executable(shared ${SRCS})

target_link_libraries(shared ${SHARED_LIBS})

7.include下fun1.h

#ifndef _FUN1_H_
#define _FUN1_H_
extern void fun1(void);
#endif

8.include下fun2.h

#ifndef _FUN2_H_
#define _FUN2_H_
extern void fun2(void);
#endif

9.src下fun1.c

#include <stdio.h>

void fun1(void) {
    fprintf(stdout, "file:%s,fun:%s,line:%d\n", __FILE__, __FUNCTION__, __LINE__);
}

10.src下fun2.c

#include <stdio.h>

void fun2(void) {
    fprintf(stdout, "file:%s,fun:%s,line:%d\n", __FILE__, __FUNCTION__, __LINE__);
}

11.src下main.c

#include <fun1.h>
#include <fun2.h>

int main(int argc, char** argv) {
    fun1();
    fun2();
    return 0;
}

12.src_static_lib下main.c

#include <fun1.h>

int main(int argc, char** argv) {
    fun1();
    return 0;
}

13.src_shared_lib下main.c

#include <fun2.h>

int main(int argc, char** argv) {
    fun2();
    return 0;
}

五、演示

1.使用cmake生成makefile

2.使用make编译

3.运行

 

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值