cmake项⽬⽬录的结构
cmake项⽬⽬录的结构
  对于c++来说,⼿动写makefile⽆疑是⼀个⾮常痛苦⽽且单调的事情,所以聪明的程序员们就发明了⼀个⾃动编写makefile的程序cmake,cmake通过读取⽂件,可以⾃动的⽣成make⽂件,⽽且cmake中macro和function的使⽤,使得使⽤cmake更像是⼀个脚本语⾔。
  对于简单的项⽬,所有的源⽂件和头⽂件可以放在⼀个⽂件夹中,⼀个⽂件即可完成编译⽣成makefile,在⼤⼀些的项⽬中,则需要根据功能和层次对源⽂件进⾏分类存放。在⼀个⼯程项⽬中,src⽂件夹肯定是要有的,⾥⾯⼀般会保存源⽂件以及头⽂件。例如:
.
├── bin
├── build
├──
└── src
├──
├── main.cpp为什么现在都用cmake
├── model1
│├──
│├── model1.cpp
│└── model1.h
├── model2
│├──
│├── model2.cpp
│└── model2.h
└── model3
├──
├── model3.cpp
└── model3.h
其中,根⽬录下是⼊⼝⽂件,进⾏初始设置和记录⼀些项⽬的描述。build⽂件夹⽤于存放编译⽣成的⽂件,bin⽂件夹⽤于存放可执⾏⽂件以及⽣成的库⽂件,对于⼤⼀点的项⽬可能还会需要util⽂件夹,library⽂件夹或者tool⽂件夹,这些可以通过调整根⽬录下实现⼦⽂件夹的编译或者复制对应⽂件到指定位置。在⽂件中设置 
add_subdirectory(${PROJECT_SOURCE_DIR}/src)可以实现cmake⾃动进⼊src⽂件夹执⾏cmake命令。
  对于上述例⼦,共有3个基础模块,model1,model2,model3,还有⼀个主⽂件main.cpp。main.cpp依赖于这3个基础模块,其中model2,model3⼜依赖于model1。所以在src根⽬录下的需要设置  target_link_libraries(cmakeTest model1 model2 model3)进⾏动态库⽂件的依赖。model2,model3⽂件夹中的也需要进⾏依赖设置。
  对于项⽬中的头⽂件位置,有⼀部分的项⽬会在项⽬中设⽴include⽂件夹统⼀存放头⽂件,我则喜欢
将头⽂件与源⽂件放在⼀起,由于源⽂件与头⽂件是同名的,所以他们在⽂件夹中会是相邻⽂件,⾮常⽅便查。
  在整个项⽬中,最需要注意的是头⽂件的搜索问题,以及头⽂件在cmake中的传递问题。对于cmake,⼦⽬录下的cmake,是可以继承上级⽬录下的cmake中的头⽂件的搜索路径的,所以在上级⽬录下⾥⾯写的include_directories,都会被⼦⽬录下的cmake继承。很多⼯程就是在顶级⾥⾯写include_directories,这样⼦整个⼯程的所有⽂件夹下的cmake都可以到这些头⽂件。还有通常的⼿段是通过file命令搜索某个⽬录⾥⾯的.h⽂件,或者使⽤macro程序来⾃动搜索头⽂件,然后放在某个变量中,然后在add_executable中增加该变量作为依赖。
  在我⾃⼰写的例⼦中,我是使⽤cmake的target_include_directories命令,在编译库⽂件时,设置使⽤该命令可以⾃动让依赖该库⽂件的⽬标⾃动将对应的头⽂件⽬录设置为⾃⼰的头⽂件搜索⽬录,然后在可执⾏⽬标设置target_link_libraries命令,cmake会根据依赖⾃动去添加库⽂件对应的头⽂件。