cmake 编译学习记录----指定源文件路径,链接库.......

一.指定cmake版本cmake_minimum_required()

cmake_minimum_required(VERSION 2.6)

二.指定项目名字project()

project(softsz_edge_detect)

三.头文件

include_directories(    ${PROJECT_SOURCE_DIR}/../inc_meg )

四.源文件

4.1单个

aux_source_directory(< dir > < variable >)

4.2多个源文件

4.2.1.aux_source_directory()

dir:要搜索的目录
variable:将从dir目录下搜索到的源文件列表存储到该变量中

aux_source_directory(${PROJECT_SOURCE_DIR} SRC_DIR)
aux_source_directory(${PROJECT_SOURCE_DIR}/src SRC_DIR)
4.2.2.file()
file(GLOB/GLOB_RECURSE  CPP_SOURCES  ${PROJECT_SOURCE_DIR}/rc/*.cpp)

GLOB: 将指定目录下搜索到的满足条件的所有文件名生成一个列表,并将其存储到变量中。
GLOB_RECURSE:递归搜索指定目录,将搜索到的满足条件的文件名生成一个列表,并将其存储到变量中。 

五.生成链接库

需要*.cpp + .h

动态链接库与静态链接库区别

5.1静态add_library(   1   static 2 )

add_library(库名称 STATIC 源文件1 [源文件2] ...) 

多个文件
file(GLOB SRC_LIST "${CMAKE_CURRENT_SOURCE_DIR}/src/*.cpp")
set(LIBRARY_OUTPUT_PATH ${PROJECT_SOURCE_DIR}/lib)  ###静态库指定生成路径
add_library(calc STATIC ${SRC_LIST})

5.2动态add_library(   1   SHARED 2 )

add_library(库名称 SHARED 源文件1 [源文件2] ...) 
add_library(demo SHARED ${SRC_DIR})

多个源文件
cmake_minimum_required(VERSION 3.0)
project(CALC)
include_directories(${PROJECT_SOURCE_DIR}/include)
file(GLOB SRC_LIST "${CMAKE_CURRENT_SOURCE_DIR}/src/*.cpp")
set(EXECUTABLE_OUTPUT_PATH ${PROJECT_SOURCE_DIR}/lib)  ###设置动态库生成路径
add_library(calc SHARED ${SRC_LIST})

六.生成可执行文件

6.1可指定输出目录

set(HOME /home/robin/Linux/Sort)
set(EXECUTABLE_OUTPUT_PATH ${HOME}/bin)

6.2生成可执行文件

cmake_minimum_required(VERSION 3.0)
project(CALC)
set(CMAKE_CXX_STANDARD 11)
set(HOME /home/robin/Linux/calc)
set(EXECUTABLE_OUTPUT_PATH ${HOME}/bin/)
include_directories(${PROJECT_SOURCE_DIR}/include)
file(GLOB SRC_LIST ${CMAKE_CURRENT_SOURCE_DIR}/src/*.cpp)
add_executable(app  ${SRC_LIST})

七.链接库文件到可执行文件

静态库动态库区别:静态库在连接到可执行文件后 会把静态库文件和源文件都打包到可执行文件

      动态库在程序启动后,调用到动态库程序中的程序时动态库才加载到内存中

静态库通常较大,需要发布较小的则生成动态库 。

需要main.cpp + .h +lib

7.1链接静态库

单个

link_directories(<lib path>)           ####指定库的搜索路径
link_librarie(    static <lib>   )     ----链接库

多个

link_libraries(    static <lib>   <lib> <lib> )

link_directories( <lib path>  <.so path> <.a path>)  ---指定路径自带的需要制定路径
cmake_minimum_required(VERSION 3.0)
project(CALC)
# 搜索指定目录下源文件
file(GLOB SRC_LIST ${CMAKE_CURRENT_SOURCE_DIR}/src/*.cpp)
# 包含头文件路径
include_directories(${PROJECT_SOURCE_DIR}/include)
# 包含静态库路径
link_directories(${PROJECT_SOURCE_DIR}/lib)
# 链接静态库
link_libraries(calc)
add_executable(app ${SRC_LIST})

 通过链接库调试文件时只需要 链接库与头文件+测试文件 (其中链接库相当于二进制源代码)

7.2链接动态库

target_link_libraries(
    <target> 
    <PRIVATE|PUBLIC|INTERFACE> <item>... 
    [<PRIVATE|PUBLIC|INTERFACE> <item>...]...)


cmake_minimum_required(VERSION 3.0)
project(TEST)
file(GLOB SRC_LIST ${CMAKE_CURRENT_SOURCE_DIR}/*.cpp)
# 指定源文件或者动态库对应的头文件路径
include_directories(${PROJECT_SOURCE_DIR}/include)
# 指定要链接的动态库的路径
link_directories(${PROJECT_SOURCE_DIR}/lib)   指定库路径
# 添加并生成一个可执行程序
add_executable(app ${SRC_LIST})
# 指定要链接的动态库             必须写在最后一行
target_link_libraries(app pthread calc)     第三方的库 和系统库    

 八 追加、移除、宏定义 

用于调试debug时

cmake_minimum_required(VERSION 3.0)
project(TEST)
set(TEMP "hello,world")
file(GLOB SRC_1 ${PROJECT_SOURCE_DIR}/src1/*.cpp)
file(GLOB SRC_2 ${PROJECT_SOURCE_DIR}/src2/*.cpp)
# 追加(拼接)
set(SRC_1 ${SRC_1} ${SRC_2} ${TEMP})
message(STATUS "message: ${SRC_1}")


cmake_minimum_required(VERSION 3.0)
project(TEST)
set(TEMP "hello,world")
file(GLOB SRC_1 ${PROJECT_SOURCE_DIR}/*.cpp)
# 移除前日志
message(STATUS "message: ${SRC_1}")
# 移除 main.cpp
list(REMOVE_ITEM SRC_1 ${PROJECT_SOURCE_DIR}/main.cpp)
# 移除后日志
message(STATUS "message: ${SRC_1}")

#include <stdio.h>
#define NUMBER  3

int main()
{
    int a = 10;
#ifdef DEBUG
    printf("我是一个程序猿, 我不会爬树...\n");
#endif
    for(int i=0; i<NUMBER; ++i)
    {
        printf("hello, GCC!!!\n");
    }
    return 0;
}





cmake_minimum_required(VERSION 3.0)
project(TEST)
# 自定义 DEBUG 宏
add_definitions(-DDEBUG)
add_executable(app ./test.c)

常用宏

PROJECT_SOURCE_DIR	        使用cmake命令后紧跟的目录,一般是工程的根目录
PROJECT_BINARY_DIR	        执行cmake命令的目录
CMAKE_CURRENT_SOURCE_DIR	当前处理的CMakeLists.txt所在的路径
CMAKE_CURRENT_BINARY_DIR	target 编译目录
EXECUTABLE_OUTPUT_PATH    	重新定义目标二进制可执行文件的存放位置
LIBRARY_OUTPUT_PATH        	重新定义目标链接库文件的存放位置
PROJECT_NAME	            返回通过PROJECT指令定义的项目名称
CMAKE_BINARY_DIR	        项目实际构建路径,假设在build目录进行的构建,
                                        那么得到的就是这个目录的路径

九、嵌套的CMake

        根目录下添加子节点路径

# 添加子目录
add_subdirectory(calc)
add_subdirectory(sort)
add_subdirectory(test1)
add_subdirectory(test2)


 子节点   搜索路径时  使用 ./

cmake_minimum_required(VERSION 3.0)
project(CALCLIB)
aux_source_directory(./ SRC)
include_directories(${HEAD_PATH})
set(LIBRARY_OUTPUT_PATH ${LIB_PATH})
add_library(${CALC_LIB} STATIC ${SRC})


条件判断循环..............

学习爱编程的大丙记录如上
作者: 苏丙榅
链接: https://subingwen.cn/cmake/CMake-primer/
 

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值