CMake里面怎么递归地设定头文件的搜索目录

CMake里面怎么递归地设定头文件的搜索目录,第1张

CMake头文件搜索路径

# 中午吃完饭,就到了办公室,开始看 OGRE 的CMake配置文件。

# 想根据实例,再配合 CMake 安装包里自带了官方Manual,学习CMakeLists文件的编写。

# 不得不承认,没有外网真心惨。用手机查资料眼睛都瞅瞎了。

# 中间出去吃了个晚饭,然后一直研究到10点,还算是有点收获

本文内容要点:

1. 多目录下,头文件路径包含

2. 项目依赖关系设置

3. 发现的一些问题

本文涉及到的CMake命令

project(name) : 设置project的名字为name。

add_dependencies:设置依赖关系

add_subdirectory:添加子目录

add_executable:添加可执行文件

add_library:添加库

cmake_minimum_required:设置cmake最低版本要求

include_directories:包含目录

target_link_libraries:链接库

set:可以用于设置变量

补充命令:

file(GLOB_RECURSE HEADER_FILES dir/*.h??)

此命令可以用来收集源文件 HEADER_FILES 作为变量保存收集的结果。 后面为文件过滤器,其中dir为起始搜索的文件夹,即在dir目录下,开始收集,而且会遍历子目录。 ? 代表 a-z。

首先给出目录结构(“-”表示目录级数)

-sin

--include

---sin.h

--src

---sin.cpp

-sinutil

--include

---sinutil.h

--src

---sinutil.cpp

-main

--main.cpp

目的:

main.cpp 要使用 sin 里面 sin.h 和 sin.cpp 生成的静态库 sin.lib,而 sin.lib 的生成要使用 sinutil 里面的 sinutil.h 和 sinutil.cpp 生成的静态库 sinutil.lib 。

sinutil.cpp 要包含 sinutil.h,而 sinutil.h 不在 sinutil.cpp 目录下。同理 sin.cpp 也要包含 sinutil.h ,main.cpp 要包含 sin.h。

根据CMake的规则,在根目录下和每个子目录下加入 CMakeLists.txt 文件。

# 为了便于区分,我给每个 CMakeLists.txt 加了编号后缀。

# 真正运行的时候,CMake配置文件只能命名为 CMakeLists.txt。

得到的目录结构如下:

- CMakeLists.txt - 1

-sin

-- CMakeLists.txt - 2

--include

---sin.h

--src

---sin.cpp

-sinutil

-- CMakeLists.txt - 3

--include

---sinutil.h

--src

---sinutil.cpp

-main

-- CMakeLists.txt - 4

--main.cpp

CMake配置文件内容如下:

#CMakeLists.txt - 1

cmake_minimum_required(VERSION 2.8.1)

project(CMakeDemo)

include_directories(${CMakeDemo_SOURCE_DIR}/sin/include)

include_directories(${CMakeDemo_SOURCE_DIR}/sinutil/include)

add_subdirectory(sin)

add_subdirectory(sinutil)

add_subdirectory(main)

#CMakeLists.txt - 4

project(MainDemo)

set(SRC_LIST main.cpp)

add_executable(demo ${SRC_LIST})

add_dependencies(demo SinLibrary)

target_link_libraries(demo ${SinLibrary})

#CMakeLists.txt - 2

set(HEADER_LIST include/sin.h)

set(SRC_LIST src/sin.cpp)

include_directories(${CMAKE_CURRENT_SOURCE_DIR}/include)

add_library(SinLibrary ${HEADER_LIST} ${SRC_LIST})

add_dependencies(SinLibrary SinUtilLibrary)

target_link_libraries(SinLibrary ${SinUtilLibrary})

#CMakeLists.txt - 3

set(HEADER_LIST include/sinutil.h)

set(SRC_LIST src/sinutil.cpp)

include_directories(${CMAKE_CURRENT_SOURCE_DIR}/include)

add_library(SinUtilLibrary ${HEADER_LIST} ${SRC_LIST})

结论:

1. CMake使用 include_directories 命令来添加头文件包含路径,且 include_directories 命令具有继承性。下级目录继承了上级目录中CMakeLists.txt 里面 include 的 directrories。但是平级目录之间的 CMakeList.txt 里面的include_directories 不能共享。

2. CMAKE_CURRENT_SOURCE_DIR 为 CMake 定义的环境变量,指向当前 CMakeLists.txt 所在的目录。

3. 当使用 project(name) 命令时,CMake会自动生成两个变量 name_SOURCE_DIR 和 name_BINARY_DIR,前一个指向使用 project 命令的CMakeLists.txt 所在的文件夹,后一个指向用cmake构建时,Build 目录下对应的目录。

问题:

1. 目前还没搞清 project 与 VS 里面的 解决方案(solution)和 工程(项目,project)的对应关系。

2. 使用 add_dependencies 来设置依赖关系时,在VS 2003 下,会为每一个subdirectory里面的project生成一个额外的带 UTILITY 后缀的工程,能不生成吗?

将第三方库文件添加到对应的架构目录中

如果有多个目录的,可能会报错:

More than one file was found with OS independent path 'lib/armeabi-v7a/libmyJNI.so'

参考 https://blog.csdn.net/lftaoyuan/article/details/106718096

关联头文件目录到库名

导入第三方库

关联到log库中

如果加载头文件报错没找到方法,可能是因为没加载成功,仔细对照流程过一遍。

注释:以 # 开头

cmake_minimum_required(VERSION 3.4.1) #设置Cmake最小版本

ADD_EXECUTABLE(exeNme 源码位置) #编译为可执行程序

add_library(libName STATIC 源码位置) # 生成静态链接库

add_library(libName SHARED 源码位置) # 生成动态链接库

SET(变量名 变量值) #设置变量

例如:

SET(srcDir main.c) 等价于 srcDir = "main.c"

SET(srcDir main.c demo.c test.c) 等价于 srcDir = "main.c demo.c test.c"

add_executable(debugger ${srcDir})#用 美元符号 使用变量

include_directories(路径)#设置头文件搜索路径,以CmakeLists.txt所在目录为根目录.

源文件中可以使用 <>来引入自己的头文件了,与引入标准库头文件保持格式的一致

例如:

include_directories(header) 则,源码中使用头文件的时候会从CmakeLists.txt所在目录/header 中去寻找

add_subdirectory(mod1 lib)#执行 mod1/CmakeLists.txt文件,并且把输出文件放在lib文件夹,同时会把lib文件夹作为链接库的搜索位置

link_directories(${PROJECT_SOURCE_DIR}/build/lib)#指明链接库的位置,如果程序要使用链接库,请一定要将此命令尽量写的靠前一些,要不然有时候会找不到链接库.我也不知道为什么....

target_link_libraries(exeName libName)#链接 libName,注意,链接之前要指明链接库的位置,如果libName代表动态链接库,则运行的时候需要把它拷贝到exeName同目录下

如果运行程序涉及到了动态链接库,则运行到时候需要把动态链接库拷贝到运行程序所在的文件夹.

例如:

静态链接库 A

静态链接库 B

动态链接库 C

可执行程序 D

A依赖B和C

D依赖A,

则D运行的时候需要把B和C一起拷贝到其目录下.注意,B是静态的,依然要拷贝过去.


欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/bake/11629933.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-17
下一篇 2023-05-17

发表评论

登录后才能评论

评论列表(0条)

保存