Assimp编译与配置
- 环境
- 源码下载
- 编译
- 配置环境
- 配置 Include 文件
- 配置 .lib 文件
- 配置 .dll 文件
- 测试
参考文章Assimp 编译(Visual Studio 2019)
使用vs2022编译assimp,并基于OpenGL加载模型
环境
win11
Assimp 5.2.5
VisualStudio2019
cmake 3.26
源码下载
Assimp releases
5.3版本我尝试用visualstudio2019编译失败,不知道什么原因,5.2是可以的
编译
- 下载源码之后解压文件
进入解压后的assimp-5.2.5路径,新建build文件夹作为输出目录
打开cmake的gui选择源码路径和输出目录
- 点击configure,弹窗中选择生成项目使用的VS版本,我这里用的是VS2019,点击Finish
- 可能会报错的提示找不到DirectX SDK
需要安装DirectX:官网下载
安装之前需要先卸载Microsoft Visual C++ 2010 x64 Redistributable和Microsoft Visual C++ 2010 x86 Redistributable这两个东西
安装好DirectX之后,再讲之前卸载的内容下载回来即可
下载地址
选择这两个内容下载
- 安装好DirectX之后再回到cmake点击configure
出现以下警告忽略即可,不影响
configure结束
- 点击genarate
- 点击open project,在VS中打开项目
- 选中ALL_BUILD
- 在release模式下生成解决方案即可
运行结果
配置环境
配置 Include 文件
将build文件夹下的include复制到assimp源码中的include中,也就是将两个include合并到一起。然后在VisualStudio的项目中配置项目属性,在项目的包含目录中添加这个include路径即可。
配置 .lib 文件
编译好后\build\lib\Release路径下会生成assimp-vc142-mt.lib
将这个绝对路径添加到项目属性中的库目录中
然后在链接器-输入中添加lib文件名称
配置 .dll 文件
拷贝 build\bin\Release目录下的assimp-vc142-mt.dll 到项目的可执行文件目录下。
只是这样的话每新建一个项目都要拷贝一次dll文件
有个一劳永逸的方法是将dll文件拷贝到C:\Windows\System32路径下,但是我不太推荐这种方法
以上include路径lib文件dll文件配置方法是通用的,几乎每一个库都可以这样配置
测试
运行测试代码
#include <assimp/Importer.hpp> // C++ importer interface
#include <assimp/scene.h> // Output data structure
#include <assimp/postprocess.h> // Post processing flags
#include <assimp/config.h>
#include <iostream>
#pragma comment (lib, "assimp-vc142-mt.lib")
void LoadFinish(const aiScene* scene)
{
std::cout << "LoadFinish ! NumVertices : " << (*(scene->mMeshes))->mNumVertices << std::endl;
}
bool LoadModel(const std::string& pFile)
{
// Create an instance of the Importer class
Assimp::Importer importer;
// And have it read the given file with some example postprocessing
// Usually - if speed is not the most important aspect for you - you'll
// probably to request more postprocessing than we do in this example.
const aiScene* scene = importer.ReadFile(pFile,
aiProcess_CalcTangentSpace |
aiProcess_Triangulate |
aiProcess_JoinIdenticalVertices |
aiProcess_SortByPType);
// If the import failed, report it
if (!scene)
{
std::cout << importer.GetErrorString() << std::endl;
return false;
}
// Now we can access the file's contents.
LoadFinish(scene);
// We're done. Everything will be cleaned up by the importer destructor
return true;
}
int main()
{
LoadModel("ccap_n.ply");
return 0;
}
运行结果
配置完成!