cmake项目目录的结构

cmake项目目录的结构


   对于c++来说,手动写makefile无疑是一个非常痛苦而且单调的事情,所以聪明的程序员们就发明了一个自动编写makefile的程序cmake,cmake通过读取CMakeLists.txt文件,可以自动的生成make文件,而且cmake中macro和function的使用,使得使用cmake更像是一个脚本语言。
   对于简单的项目,所有的源文件和头文件可以放在一个文件夹中,一个CMakeLists.txt文件即可完成编译生成makefile,在大一些的项目中,则需要根据功能和层次对源文件进行分类存放。在一个工程项目中,src文件夹肯定是要有的,里面一般会保存源文件以及头文件。例如:
项目对应的gitee地址

.
├── bin
├── build
├── CMakeLists.txt
└── src
    ├── CMakeLists.txt
    ├── main.cpp
    ├── model1
    │   ├── CMakeLists.txt
    │   ├── model1.cpp
    │   └── model1.h
    ├── model2
    │   ├── CMakeLists.txt
    │   ├── model2.cpp
    │   └── model2.h
    └── model3
        ├── CMakeLists.txt
        ├── model3.cpp
        └── model3.h

其中,根目录下CmakeLists.txt是入口文件,进行初始设置和记录一些项目的描述。build文件夹用于存放编译生成的文件,bin文件夹用于存放可执行文件以及生成的库文件,对于大一点的项目可能还会需要util文件夹,library文件夹或者tool文件夹,这些可以通过调整根目录下CmakeLists.txt实现子文件夹的编译或者复制对应文件到指定位置。在CmakeLists.txt文件中设置 add_subdirectory(${PROJECT_SOURCE_DIR}/src)可以实现cmake自动进入src文件夹执行cmake命令。
   对于上述例子,共有3个基础模块,model1,model2,model3,还有一个主文件main.cpp。main.cpp依赖于这3个基础模块,其中model2,model3又依赖于model1。所以在src根目录下的CmakeLists.txt需要设置  target_link_libraries(cmakeTest model1 model2 model3)进行动态库文件的依赖。model2,model3文件夹中的CmakeLists.txt也需要进行依赖设置。
   对于项目中的头文件位置,有一部分的项目会在项目中设立include文件夹统一存放头文件,我则喜欢将头文件与源文件放在一起,由于源文件与头文件是同名的,所以他们在文件夹中会是相邻文件,非常方便查找。
   在整个项目中,最需要注意的是头文件的搜索问题,以及头文件在cmake中的传递问题。对于cmake,子目录下的cmake,是可以继承上级目录下的cmake中的头文件的搜索路径的,所以在上级目录下CmakeLists.txt里面写的include_directories,都会被子目录下的cmake继承。很多工程就是在顶级CmakeLists.txt里面写include_directories,这样子整个工程的所有文件夹下的cmake都可以找到这些头文件。还有通常的手段是通过file命令搜索某个目录里面的.h文件,或者使用macro程序来自动搜索头文件,然后放在某个变量中,然后在add_executable中增加该变量作为依赖。
   在我自己写的例子中,我是使用cmake的target_include_directories命令,在编译库文件时,设置使用该命令可以自动让依赖该库文件的目标自动将对应的头文件目录设置为自己的头文件搜索目录,然后在可执行目标设置target_link_libraries命令,cmake会根据依赖自动去添加库文件对应的头文件。

  • 2
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值