前言
用CMake管理自己的程序(一)
用CMake管理自己的程序(二)
用CMake管理自己的程序(三)
通过之前的文章,我们已经可以做到最基本的工程管理了,这篇文章,我们将对之前的工作做一个完善,让我们对程序的管理更加的合理。
target开头的命令
相信大家都注意到了,cmake是一个命令式的工具,其中,我们会发现一些功能相似的命令。
例如之前我们为了能够找到库的头文件,使用了include_directories命令,而现在我要介绍一个target开头的命令:target_include_directories命令。例子如下:
从使用命令的目的上来说,这两个命令基本上没有任何区别,效果也是。都是指定目录,让编译时可以找到头文件。
然而,include_directories命令是一个全局命令,也就是在这个命令之后的所有代码中,包括子目录的项目中,也会增加该命令所指定的目录。顺带一提link_directories命令可以让之后所有的代码中,包括子目录的项目中,增加对应的库文件查找目录。
如果你的目标就是让所有的程序都包含一个指定的搜索目录,那么在总CMakeLists.txt中使用include_directories命令是没有问题的。但是,如果你的目标只是让一个指定的编译目标(通过add_executable或add_library指定的)而不是所有的目标包含特定的查找目录,那么你就应该考虑使用target_include_directories命令。
事实上,所有针对特定编译目标的设置,都应该使用target开头的命令,比如target_compile_options命令。 这是一个使用target_compile_options命令设置输入文件编码的例子:
用这种方式就可以单独的指明test这个目标的输入编码是GBK而不会影响其它的目标。
这是cmake 3.19.2中所有target开头的命令,可以自行查看文档了解详细的用法
target_compile_definitions
target_compile_features
target_compile_options
target_include_directories
target_link_directories
target_link_libraries
target_link_options
target_precompile_headers
target_sources
区分Debug与Release
相信大家使用第三方库的时候,一定会注意到大部分C++库都提供了Debug版与Release版,并且这两个版本的库可能在同一个目录下但是有不同的名字,也可能在不同的目录下但是有相同的名字。
无论是哪一种,当这个第三方库不提供cmake的包的时候,我们就需要手动指定当前要加载哪个库。此时,我们就需要能够区分Debug与Release。
一般情况下,target_link_libraries命令是最需要区分debug和release的,如果库的名称是一样的,但是放在了不同的目录下,那么我们可以直接这么写:
但是如果名称是不同的,那么我们就可以统一的设置搜索路径,然后只需要提供名称即可
对于没有debug和release区分的库或者提供了cmake包的库ÿ