抱歉,您的浏览器无法访问本站
本页面需要浏览器支持(启用)JavaScript
了解详情 >

Cmake 使用过程中的一些记录

写在前面

终于还是用起来cmake了, 先前都是手撕makefiles, 直接用makefiles编写项目文件

但终归还是太麻烦,需要考虑各种依赖关系,可以说是事无巨细,后来转到windows上做项目开发,才发现

cmake特别好用,真的能省很多事

参考

优雅的本地开发,远程linux环境调试,Clion决绝子

本地clion开发/优雅地调试,并实时同步远程服务器

Cmake-Example

cmake-examples

一个非常好的github开源库,作为cmake初学者非常适用

记录常用到的cmake用法

include_directories

设定本项目引入的头文件路径,${PROJECT_SOURCES} 可以通过set() 来设置;

include_directories(${PROJECT_SOURCES}/include) 

当引入头文件路径后,在项目编写时就可以非常优雅的引入了

例如: 项目结构如下

main-project:
	include:
		basic:
			headerA.h
		pro:
			plus:
				headerB.h
	src:
		main.cpp

假设headerB需要引入headerA.h头文件, 一般的写法是include "../../basic/headerA.h" 这种相对路径

当我们设置include_directories(${main_project_path}/include)

只需要在headerB.h中写include "basic/headerA.h" 就可以了,系统会自动帮我们找到对于的路径下的文件

那么在main.cpp中引入头文件时

只需要编写:

#include "basic/headerA.h"
#include "pro/plus/headerB.h"

target_link_libraries

target_include_directories

这两个的用法都是在设定生成库文件或者可执行文件标识之后:

add_library / add_executable

# 编译生成静态库/动态库
add_library(<name> STATIC/SHARED <sourcefiles>)

# 库的头文件搜索路径/ 依赖项
# 等价于 makefile中的 -L/path
target_include_directories(<name> <option> <path>)
target_link_libraries(<name> <option> <deplibraries>)
>target_include_directories(target
  [SYSTEM] [BEFORE]
  <INTERFACE|PUBLIC|PRIVATE> [items1...]
  [<INTERFACE|PUBLIC|PRIVATE> [items2...] ...])

其中,target 是目标名称,可以是库或可执行文件的名称。
SYSTEM 表示这些头文件是系统头文件,BEFORE 表示这些路径将被添加到其他路径之前。INTERFACEPUBLICPRIVATE 是指定这些路径的可见性。它们的含义如下:

  • INTERFACE:这些路径只会被添加到目标的接口中,不会被添加到目标自身的编译选项中。
  • PUBLIC:这些路径会被添加到目标自身的编译选项中,同时也会被添加到目标的接口中。
  • PRIVATE:这些路径只会被添加到目标自身的编译选项中,不会被添加到目标的接口中。
    items 是头文件搜索路径,可以是绝对路径或相对路径。如果是相对路径,会相对于当前 CMakeLists.txt 文件所在的目录进行解析。

Subject

项目结构:

main_project
	sub_project_A:
		project_A_files
		CMakeLists.txt
	sub_project_B:
    	project_B_files
		CMakeLists.txt
	CMakeLists.txt

sub_projectAsub_projectB都是main_project的依赖库

其中projectB又依赖于projectA

main_project下的CMakeLists.txt

可以通过一下命令,给子subject传参, 以及添加子项目

set(PROJECT_SOURCES ${CMAKE_CURRENT_SOURCE_DIR}/path/to/proejctA)
add_subdirectory(path/to/project)

sub_projectB中通过主项目的传参,拿到sub_projectA的路径,就可以

设置include_directories target_link_libraries target_include_directories

评论吧



本站总访问量为 访客数为

鲁 ICP 备 20018157 号-1
Copyright 2021 - 2022 sizaif. All Rights Reserved