从项目开始学习CMake(2)

第一期讲述了一般一个根目录文件下的cmakelists.txt文件应该如何写,这期记录一下代码目录中的cmakelists.txt一般有哪些内容
这里也可以添加一个

project(testOne LABGUAGES CXX)

表示当前目录下也会生成一个项目文件,开发语言用的c++

接着可以使用set将当前目录下的代码文件(例如源文件和头文件)设置成一个变量(SOURCE_FILES)包起来,这些文件(test.h,test.cpp)会参与到当前项目中

set(SOURCE_FILES
	test.h
	test.cpp
)

接着涉及QT开发,需要用到

set(CMAKE_AUTOMOC ON)
set(CMAKE_AUTORCC ON)
set(CMAKE_AUTOUIC ON)

AUTOMOC:负责处理信号槽,生成信号的moc_xxx.cpp文件
AUTORCC:负责处理qrc资源文件
AUTOUIC:负责处理ui文件,生成对应的ui_xxxx.h文件

接着是

add_library(${PROJECT_NAME} SHARED
    ${SOURCE_FILES}
)

这里会按照需要最后生成一个动态库文件,在Windows上即为dll文件,其中project_name即为上面所说的testOne,也会是项目后续生成的dll名,
其中的SHARED表示这个文件为动态库,如果需要生成静态库文件,需要修改成STATIC,
而后面的变量SOURCE_FILES则为上面我们之前定义的变量,表示会有之前定义的两个文件参与编译
如果需要生成的是exe文件,即执行文件,则需要用到add_executable命令
一般结构如下:

add_executable (<name> [WIN32] [MACOSX_BUNDLE]
	[EXCLUDE_FROM_ALL]
	[source1] [source2 ...])

参数
name:可执行目标文件的名字,在一个cmake工程中,这个名字必须全局唯一。
WIN32:用于windows系统下创建一个以WinMain为入口的可执行目标文件(通常入口函数为main),它不是一个控制台应用程序,而是一个GUI应用程序。当WIN32选项使用的时候,可执行目标的 WIN32_EXECUTABLE会被置位ON。
MACOSX_BUNDLE:用于mac系统或者IOS系统下创建一个GUI可执行应用程序,当MACOSX_BUNDLE选项使用的时候,可执行目标的MACOSX_BUNDLE会被置位ON。
EXCLUDE_FROM_ALL:用于指定可执行目标是否会被构建,当该选项使用的时候,可执行目标不会被构建。
[source1] [source2 …]:构建可执行目标文件所需要的源文件。也可以通过target_sources()继续为可执行目标文件添加源文件,要求是在调用target_sources之前,可执行目标文件必须已经通过add_executable或add_library定义了。

接着一般是设置该项目文件需要include的范围以及link的库
在add_library或add_executable之后,可以用target_include_directories来说明include的范围,例如

target_include_directories(${PROJECT_NAME} PRIVATE
/path/include
)

这里表示当前项目会在/path/include目录下进行头文件的查找(一般include相关文件,发现找不到该文件,是这里没有包含到)
其中有一个参数在project后面
INTERFACE:target对应的头文件使用
PRIVATE:target对应的源文件使用
PUBLIC:target对应的头文件、源文件都使用

同样在add_library或add_executable之后可以用target_link_directories去指定链接器搜索库文件的目录。表示当链接器需要查找库文件时,它会在这些目录中搜索

target_link_directories(${PROJECT_NAME} PRIVATE
    ${SDK_LIB_PATH}
)

接下来制定链接所需要的库,例如

target_link_libraries(${PROJECT_NAME} PRIVATE
    Qt5::Core
    Qt5::Widgets
    Qt5::Gui
)

其实对应qt相关的库,一般需要find_packet去先查找,但是第一期在根目录中有解释过include(.cmake)文件的用法,可以将相关find_packet操作统一。
PUBLIC 在public后面的库会被Link到你的target中,并且里面的符号也会被导出,提供给第三方使用。
PRIVATE 在private后面的库仅被link到你的target中,并且终结掉,第三方不能感知你调了啥库
INTERFACE 在interface后面引入的库不会被链接到你的target中,只会导出符号。

另外针对target_link_directories与link_directories的区别在于link_directories不用在add_library与add_execute后使用(合理,因为没有制定target),但是因此它会对后续的项目都产生影响,通俗理解就是如果你该目录下还有子目录,那么在add_subdirectory后的项目中也会有效果,因此一般建议使用target_link,这样方便控制影响。

一般来说,一个代码文件夹中的cmakelists文件就差不多是这样了,下一期记录一下.cmake文件的内容以及涉及到的一些关键词用法。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值