2.0 更好的Hello,CMake

2.0 更好的Hello,CMake本小节的任务是让前面的Hello World更像一个工程,我们需要做的是:

1,为工程添加一个子目录src,用来放置工程源代码;

2,添加一个子目录doc,用来放置这个工程的文档hello.txt

3,在工程目录添加文本文件COPYRIGHT, README;

4,将构建后的目标文件放入构建目录的bin子目录;

  2.0.1 在我们之前新建的CMakeDemo里面新建文件夹t2

  2.0.2 把之前t1中的main.c和CMakeLists.txt复制到t2目录中

  2.0.3 在t2目录中新建src目录,将main.c移动到src目录中,并在src目录中再新建一个CMakeLists.txt文件

  2.0.4 将t2目录中的CMakeLists.txt(不是src目录中的CMakeLists.txt哈),中的内容修改为

1 PROJECT(HELLO)
2 ADD_SUBDIRECTORY(src bin)

  2.0.5 把src目录中的CMakeLists.txt改为

1 ADD_EXECUTABLE(hello main.c)

  2.0.6 在t2目录中新建一个build目录,然后如果我们希望将cmake生成之后的工程放在build目录中,那么首先就得进入build目录,但是我们的主CMakeLists.txt在t2目录中,所以我们需要执行的就是cmake ..

  

  我们发现在build目录中有bin这个文件夹,这是为什么?

  因为我们将编译的东西放在了build中,实际上这个build的绝对路径就是HELLO_BINARY_DIR和HELLO_SOURCE_DIR的值,而我们在t2目录下的CMakeLists.txt中添加的

ADD_SUBDIRECTORY(src bin),实际上src就是表示存放C源文件的文件夹,然后后面的bin就是表示这个bin是在build文件夹中添加一个子目录bin来存放src编译之后的二进制文件的目录

  总结:ADD_SUBDIRECTORY指令的使用

  ADD_SUBDIRECTORY(source_dir [binary_dir] [EXCLUDE_FROM_ALL])

  这个指令用于向当前工程添加存放源文件的子目录,并可以指定中间二进制和目标二进制存
  放的位置。EXCLUDE_FROM_ALL参数的含义是将这个目录从编译过程中排除,比如,工程
  的example,可能就需要工程构建完成后,再进入example目录单独进行构建(当然,你
  也可以通过定义依赖来解决此类问题)。

  以刚刚的例子为例,如果我们不指定bin,也就是ADD_SUBDIRECTORY(src)的话,那么编译的二进制文件就会被存放在src目录中,而指定了之后就会相当于将src重命名为bin,然后再将二进制文件放在里面

  实际上与ADD_SUBDIRECTORY指令类似的还有一个SUBDIRS指令,它的格式是:

  SUBDIRS(dir1 dir2 dir3 ,...)

  使用这个指令也可以创建很多的子目录,如果我们将刚刚的ADD_SUBDIRECTORY(src bin)改用SUBDIRS(src),那么我们将会在src中看到我们编译的二进制文件

  2.0.7 我们会发现,在bin目录了里面,除了生成的exe文件之外,还有一些中间文件(比如链接时的目标文件等),那如果我们想实现既能将可执行文件放到指定的目录还可以将中间文件去掉不要应该怎么办呢?

  实际上我们可以使用SET(EXECUTABLE_OUTPUT_PATH XXXDIR)来设置,同样的还可以对LIBRARY_OUTPUT_PATH来进行设置

  我们可以将src目录下的CMakeLists.txt中加上以下:

ADD_EXECUTABLE(hello main.c)
SET(EXECUTABLE_OUTPUT_PATH ${HELLO_BINARY_DIR}/bins)

  为什么要将上面的语句放在src目录里面的CMakeLists.txt而不是t2目录下的CMakeLists.txt?

  如果需要改变目标存放路径,就在哪里加入上述的定义。我们操作的对象时main.c我们只是希望改变它被编译之后的存放位置,因此从逻辑上来讲肯定是修改src里面的CMakeLists.txt咯

  再次编译,我们可以看到bins里面有这个hello.exe

 

posted @ 2023-09-19 09:09  蜡笔小新Pointer  阅读(38)  评论(0)    收藏  举报