QT+Assimp+Cmake Windows平台使用CMake构建第三方包
工具准备
- MinGW
- CMake
上述软件在CSDN有一堆的安装下载教程,这里就不进行具体的安装演示了。
由于我本身的电脑中安装了QT Creater,最新版的QT Creater中带有了Cmake,并且在安装QT Creater时,我选择了MinGW的编译环境,因此这里我直接采用QT Creater中的MinGW 与 CMake。
在QT安装目录/Tools
路径下可以看到CMake与Mingw的安装路径。
将CMake和MingW的bin路径放到环境变量中。
打开CMD或者Powershell,输入Cmake或者gcc能够识别即可,如果不识别,显示非CMD命令,可以尝试重启电脑后再试。
至此,所需要的MingW工具与Cmake工具就准备完成了。
编译安装第三方库
这部分内容以ASSIMP库为例。
首先下载Github上的ASSIMP源码。https://github.com/assimp/assimp
然后CMD进入到源码的路径下。
# 需修改路径
cmake -G"MinGW Makefiles" -B build -DCMAKE_INSTALL_PREFIX=安装路径 -DWITH_SOME_OPTIONS=ON
cmake --build build --parallel 16
cmake --build build --target install
依次运行上述命令即可完成第三方库的安装。
其中-DCMAKE_INSTALL_PREFIX
即为第三方库的安装位置。
--parallel 16
为使用16个核并行编译,此处自行修改。
如果没有报错,即可看到安装完成,在源码路径出现Build目录。
同时在指定的安装位置出现所有需要的文件。
此时我们找到assimpConfig.cmake所处的路径。我的路径如下所示。这个路径我们会在后续步骤中使用。
D:/playground/third_lib_c/lib/cmake/assimp-5.2
调用第三方库
新建一个CMake工程测试第三方库。
工程文件结构如下所示
其中CMakeLists.txt.user是使用QT打开Cmake工程产生的文件。
CMakeList.txt的内容是
# cmake的属性
cmake_minimum_required(VERSION 3.18)
# 设置默认的模式 Debug或者Release
if (NOT CMAKE_BUILD_TYPE)
set(CMAKE_BUILD_TYPE Release)
endif()
# C++的编译器选项
set(CMAKE_CXX_STANDARD 17)
set(CMAKE_CXX_STANDARD_REQUIRED ON)
set(CMAKE_CXX_EXTENSIONS OFF)
# 第三方库路径 第二步获取得到
set(assimp_DIR D:/playground/third_lib_c/lib/cmake/assimp-5.2)
# project 名字
project(testassimp LANGUAGES CXX)
# 寻找第三方库
find_package(assimp REQUIRED)
# 设置工程源文件
file(GLOB_RECURSE srcs CONFIGURE_DEPENDS src/*.cpp include/*.h)
#add_library(testassimp STATIC ${srcs})
# 设置可执行程序
add_executable(testassimp
${srcs}
)
# 设置头文件搜索位置
target_include_directories(testassimp PUBLIC include)
# 引入第三方库assimp, 此处引入的方式是PUBLIC ,assimp的属性会传染到testassimp工程中
target_link_libraries(testassimp PUBLIC assimp::assimp)
main.cpp中尝试调用ASSIMP库,内容如下所示:
#include <assimp/Importer.hpp>
int main(int argc, char *argv[])
{
// QApplication a(argc, argv);
// Widget w;
// qDebug() << "creat class";
// w.show();
Assimp::Importer importer;
// return a.exec();
return 1;
}
如果此前你的编辑器已经设置好,或者使用IDE的话,可以看到已经能够识别到assimp中的各种头文件和函数了。如下所示
此时编译运行main.cpp,没有错误,即表示其可以正常调用assimp库。
部分问题
- build文件夹下的CMakeCache.txt是CMake的缓存,很多事情出现问题,删除CMake的缓存后,再尝试新的方法会更有效。
- 当出现提示设备不支持动态库时,首先检查是否在CMakeList.txt中,find_package出现在了project的前面。
set(assimp_DIR D:/playground/third_lib_c/lib/cmake/assimp-5.2)
不便于移植,可以将assimp_DIR的路径设置放到build时,即在cmake build时加入参数-Dassimp_DIR=D:/playground/third_lib_c/lib/cmake/assimp-5.2
- Cmake 提示未设定C或者CXX的编译器时,可以尝试在build时加入参数
-DCMAKE_CXX_COMPILER=g++ -DCMAKE_C_COMPILER=gcc