在MSVC下,通过开启、设置一些变量,并避免一些可能导致未知错误的行为,我们可以构建出更有组织的MSVS解决方案。

MSVC-SOLUTION-gouped

这个基本上都是从各种零散的地方(爆栈、一篇博客)搜到的,然后先急着用了,没有记REFERENCE。这里算是做一个总结和记录吧。

  1. 文件夹名一定不要相同。

    即是p/a/same-namep/b/same-namep/c/d/same-name这样的情况应该避免。这将导致VS(或者CMake?)在显示(构建)以下功能时出现问题,就是不会成功啦。

  2. 在根CMakeLists.txt下开启显示目录选项。

    就是以下命令:

     # dispaly folder in MSVS
     SET_PROPERTY(GLOBAL PROPERTY USE_FOLDERS ON) 
    

    这个是必须的,否者就不会显示目录结构。

  3. 手动组织目录

    如果想要构建一个好的项目解决方案,那么非常有必要手工组织代码的结构。

    这里我还没有弄得非常清楚,只能根据之前的尝试给出可用的方案:

    对于有编译目标的单元(即有ADD_EXECUTABLE或者ADD_LIBRARY),那么我们通过一下命令可以把这个编译单元放到某个目录下:

     SET_PROPERTY(TARGET trivial PROPERTY FOLDER "libraries")      
    

    如上,SET_PPRPERTY第一个参数TARGET是固定值,第二个trivial就是编译单元的名称,第三个PROPERTY,第四个FOLDER都是固定值,第五个libiraries是要放到的目录下。目录支持层级结构,这里用/来划分层级结构,如libraries/cnn

    对于无编译目标的单元(比如按功能区分的头文件),使用以下命令来使得其在MSVS显示中能够分组:

     SOURCE_GROUP("lookup_table" FILES ${lookup_table_headers}
                                       ${lookup_table_srcs}
    

    SOURCE_GROUP第一个参数同样是目录路径,路径可以是层级的,用\\双反斜杠表示,如trivial\\lookup_table就是在trivial文件夹下有lookup_table;第二个参数是FILES固定值,后面的参数就是具体的FILES路径(文件)。

    经过测试,发现对于有编译目标的单元,使用SOURCE_GROUP没有作用,实际在MSVS显示时都是以编译目标中的依赖项分组为头文件和源文件的。但是对于没有编译目标的文件,可以用这个方式来组织。因为如果我们不组织的话,那么显示的时候就是flat的结构,在文件系统中的目录层级就消失了。我们可以使用以下命令来方便的获取一个路径下的所有文件:

     FILE(GLOB lookup_table_headers "lookup_table/*.h*")
    

    FILE下第一个GLOB表示使用通配符(?),然后第二个参数lookup_table_headers用来存储结果的变量名,第三个参数(还可以后续接任意个)就是通配路径了,应该是支持*,[]之类的,具体需要查一下吧。