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/
 

  • 3
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
编译链接.lib也可以使用CMake来实现。具体步骤如下: 1. 创建一个文件夹,作为你的工程根目录。 2. 在根目录下创建一个CMakeLists.txt文件,用于编写项目的构建脚本代码。 3. 在根目录下创建一个include文件夹,用于放置头文件,创建一个src文件夹,用于放置源文件。 4. 在include文件放入你的头文件,例如:header.h。 5. 在src文件放入你的源文件,例如:source.cpp。 6. 在CMakeLists.txt添加以下代码: ``` cmake_minimum_required(VERSION 3.10) project(MyLibrary) set(CMAKE_CXX_STANDARD 11) include_directories(include) add_library(MyLibrary STATIC src/source.cpp) ``` 其cmake_minimum_required指定CMake的最低版本要求,这里是3.10版本;project指定了项目名称;set指定了使用C++11标准;include_directories指定了头文件路径;add_library指定链接库的名称以及源文件路径,这里是MyLibrary和src/source.cpp。注意这里使用了STATIC关键字,表示生成的是静态链接库。 7. 在根目录下创建一个build文件夹,用于存储编译后的文件。 8. 在终端进入到build文件,执行以下命令: ``` cmake .. make ``` 其cmake ..指定CMakeLists.txt所在的目录,生成Makefile文件;make命令则是执行Makefile文件,生成链接库文件。 最终,在build文件生成了MyLibrary.lib和MyLibrary.a文件,这就是你编译链接的文件。如果你需要使用这个文件,需要将它们添加到你的项目,并将头文件路径文件路径添加到你的项目

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值