一,先说说 makefile文件
什么是makefile文件?一个工程中的源文件不计数,其按类型、功能、模块分别放在若干个目录中,makefile定义了一系列的规则来指定,哪些文件需要先编译,哪些文件需要后编译,哪些文件需要重新编译,甚至于进行更复杂的功能操作,因为makefile就像一个Shell脚本一样,其中也可以执行操作系统的命令。makefile带来的好处就是——“自动化编译”,一旦写好,只需要一个make命令,整个工程完全自动编译,极大的提高了软件开发的效率。make是一个命令工具,是一个解释makefile中指令的命令工具,一般来说,大多数的IDE都有这个命令,比如:Delphi的make,Visual C++的nmake,Linux下GNU的make。可见,makefile成为了一种在工程方面的编译方法。
二,CMake是干嘛的
通过编写makefile文件然后使用make命令就能避免我们每次都编写那么大一段命令行命令,但是makefile使用起来有几个问题:
- 在大型项目中要自己编写makefile文件还是很麻烦
- makefile文件依赖于平台,简单描述下:win平台下使用微软自己的nmake工具以及cl编译器,假使我们在win下写好了makefile,想要将之移植到linux下(使用make与g++)又得重新再写一个makefile
- 与2类似,现在不同的平台上有不同的IDE他们都使用自己的项目构建方案各自不兼容,每次重新编译我们肯定不会希望还得自己重新写makefile
于是乎为了解决上述问题,就有了cmake工具,cmake的出现基本解决了上面的问题,于是现在大部分的第三方库都是构建在cmake上的。
cmake的特点:
- 跨平台,并可生成 本地编译配置文件,在 Linux/Unix 平台,生成 makefile,在 苹果平台,可以生成 xcode,在 Windows 平台,可以生成 MSVC 的工程文件。
- 简化编译构建过程和编译过程。Cmake 的工具链非常简单:cmake+make。
- 可扩展,可以为 cmake 编写特定功能的模块,扩充 cmake 功能。
三,cmake简单使用
(1),假设工程下有一个源文件 main.cpp
#include<iostream>
int main()
{
std::cout<<"Hello word!"<<std::endl;
return 0;
}
(2),项目目录下 编写一个 CMakeLists.txt文件
PROJECT(main)
CMAKE_MINIMUM_REQUIRED(VERSION 2.6)
AUX_SOURCE_DIRECTORY(. DIR_SRCS)
ADD_EXECUTABLE(main ${DIR_SRCS})
(3),利用 cmake工具编译
(4),windows下利用 vs 加载工程文件,编译即可
四,利用camke编译Qt工程
(1),查找Qt模块
Components
后面加的就是这个工程中会用到的Qt模块,例如上面就用到了Core、Gui、Qml、Quick这几个模块
find_package(Qt5 COMPONENTS Core Gui Qml Quick REQUIRED)
(2),打开相关自动选项
Qt Quick程序中的QRC资源文件需要用rcc来进行预处理,生成相应.h
和.cpp
文件。QObject
派生的C++类也需要通过moc进行处理。这些都是编译系统中所谓的Rules。CMake中通过打开下面两个选项可以自动对这些后缀的文件进行相应处理:
set(CMAKE_AUTOMOC ON)
set(CMAKE_AUTORCC ON)
(3),链接时设置相应模块
target_link_libraries(${PROJECT_NAME} Qt5::Core Qt5::Gui Qt5::Qml Qt5::Quick)
(4),示例
if (NOT WIN32)
return()
endif()
#相当于vs中的工程名称
project(obs-subtitle)
if(WIN32)
#查找模块
find_package(Qt5 COMPONENTS Core Gui Widgets Multimedia WebSockets Network REQUIRED)
set(CMAKE_AUTOMOC ON)
set(CMAKE_INCLUDE_CURRENT_DIR ON)
set(obs-subtitle_PLATFORM_SOURCES
subtitle/obs-subtitle.cpp
subtitle/obs-audio.cpp
subtitle/obs-wss.cpp
)
set(obs-subtitle_PLATFORM_HEADERS
subtitle/obs-audio.h
subtitle/obs-wss.h
)
set(obs-subtitle_PLATFORM_DEPS
gdiplus
Qt5::Core
Qt5::Gui
Qt5::Multimedia
Qt5::WebSockets
Qt5::Widgets
Qt5::Network
)
endif()
add_library(obs-subtitle MODULE
${obs-subtitle_PLATFORM_SOURCES}
${obs-subtitle_PLATFORM_HEADERS})
#依赖库
target_link_libraries(obs-subtitle
libobs
${obs-subtitle_PLATFORM_DEPS})
install_obs_plugin_with_data(obs-subtitle data)
windows下是cl,Linux下是g++。Windows下的make程序是nmake.exe,Linux下是make