编译Assimp傻瓜教程

时间:2024-01-25 06:58:55

assimp的编译过程和搭建OpenGL环境时glfw的编译基本相同,建议先阅读环境搭建

下载源码

这里使用的是3.3.1版本,Github下载assimp源码

解压完你会得到

接下来我们要编译这些源码

为什么要在自己机器上编译?因为从源代码编译库可以保证生成的库是兼容你的操作系统和CPU的,而预编译的二进制文件可能会出现兼容问题(甚至有时候没提供支持你系统的文件)

但是提供源代码所产生的一个问题在于不是每个人都用相同的IDE开发程序,因而源码提供的工程/解决方案文件可能和一些IDE不兼容,人们只能从.c/.cpp和.h/.hpp文件来自己建立工程/解决方案,这是一项枯燥的工作,但因此也诞生了一个叫做CMake的工具

CMake

CMake是一个工程文件生成工具 http://www.cmake.org/cmake/resources/software.html

我们可以使用预定义好的CMake脚本,根据自己的选择(像是Visual Studio, Code::Blocks, Eclipse)生成不同IDE的工程文件。这个工具就能让我们从GLFW源码里创建一个Visual Studio 2017工程文件,之后就能顺利编译

CMake需要一个源代码目录和一个存放编译结果的目标文件目录,源代码目录我们选择下载的assimp的源代码的根目录,然后我们在assimp下直接新建一个 build 文件夹作为目标目录

在设置完目录之后,点击Configure(设置)按钮,让CMake读取设置和源代码。我们接下来需要选择工程的生成器,这里我选择 Visual Studio 2017 (根据自己的IDE版本设定)CMake会显示可选的编译选项用来配置最终生成的库

这里我们使用默认设置,并再次点击Configure(设置)按钮保存设置,保存之后,点击Generate(生成)按钮,生成的工程文件会在你的build文件夹中,生成完之后我们就可以点Open Project,用你的IDE打开

注意,CMake在读取配置列表时,可能会报出DirectX库丢失的错误,报错如下:

Could not locate DirectX
CMake Error at cmake-modules/FindPkgMacros.cmake:110 (message):
Required library DirectX not found! Install the library (including dev packages) 
and try again. If the library is already installed, set the missing variables 
manually in cmake.

这个问题的解决方案是安装DirectX SDK

安装DirectX SDK时,可能遇到一个错误码为s1023的错误,这种情况下,请在安装SDK之前根据这个先卸载C++ Redistributable package(s)

编译

在因为CMake已经配置好了项目,所以我们直接点击 Build Solution(生成解决方案) 按钮

img

导入工程

接下来你需要让IDE知道库和头文件的位置,这里有两种方法:

  1. 找到IDE或者编译器的/lib/include文件夹,添加GLFW的include文件夹里的文件到IDE的/include文件夹里去。用类似的方法,将glfw3.lib添加到/lib文件夹里去。虽然这样能工作,但这不是推荐的方式,因为这样会让你很难去管理库和include文件,而且重新安装IDE或编译器可能会导致这些文件丢失
  2. 建立一个新的目录包含所有的第三方库文件和头文件,并且在你的IDE或编译器中指定这些文件夹,再OpenGL的项目中,我使用一个单独的文件夹,里面包含LibsInclude文件夹,在这里存放OpenGL工程用到的所有第三方库和头文件,这样我的所有第三方库都在同一个位置(并且可以共享至多台设备),当然,这要求你每次新建一个工程时都需要告诉IDE/编译器在哪能找到这些目录

和glfw的导入一样,这里推荐第二种方法,接下来我们先把生成的库文件和头文件导入工程,并且告诉IDE/编译器在哪能找到他们的目录

库文件

我们打开build目录,生成的库文件就在 build\code\Debug 路径下,我们需要的是下面这两个文件

将.lib文件复制到你要用到assimp的工程目录下的库目录,这里我放到了OpenGL学习项目下的,glfw3.lib所在的文件夹里,路径为 FirstOpenGL\Libraries\Lib,这样我就不必重新设定库目录

将.dll动态链接库放在工程目录下

编译出的静态库其实里面只有定义,真正实现还是要去动态库去找,所以当你把它们放进项目配置里时,编译是通过的,但是动态库并不会打进程序里,所以你得把动态库放到项目工程目录下,也就是其实你需要把静态库放进项目配置中,而动态库放在项目目录中

头文件

assimp用到的头文件在我们build文件夹的同级目录include下,路径为assimp-3.3.1\include\assimp,我这里直接将assimp文件夹复制到我工程的Include目录

接下来我们打开工程属性,再配置一番

设置引用目录和库目录,由于我放的就是之前使用的目录,这里不必更改

连接器部分则需要把assimp加上

尝试include我们导入的头文件

没有报错,OK大功告成