从源码编译Assimp未生成libassimp可链接库文件问题咨询
问题描述
- 最初使用普通控制台运行CMake编译Assimp库时报错,提示无法找到cl编译器,后续切换到x64_x86开发者命令提示符执行编译操作。
- 执行以下命令后编译流程无报错:
cmake CMakeLists.txt -DASSIMP_BUILD_ASSIMP_TOOLS=OFF cmake --build .
- 编译完成后仅生成3个目标文件:
C static library zlibstaticd.lib CXX shared library ..\bin\assimp-vc142-mtd.dll CXX executable ..\bin\unit.exe
- 编译结果中不存在MinGW环境可链接的
libassimp.a或libassimp.so文件。尝试在自有MinGW项目中直接链接生成的dll,添加如下链接参数:
-L\"{assimp root directory}/bin\" -lassimp-vc142-mtd
- 链接阶段失败,报错信息:
undefined reference to 'Assimp::Importer::Importer()',需要获取可在MinGW环境下正常链接的Assimp库文件。
解决方案
链接报错的核心原因是ABI不兼容:你用MSVC开发者命令提示符编译出来的是MSVC格式的二进制库,和MinGW/GCC的符号修饰规则、运行时接口不匹配,哪怕文件名匹配,MinGW也无法正确识别MSVC编译生成的dll里的导出符号,自然会报未定义引用的错误。
按以下步骤编译可正常使用的MinGW版本Assimp库即可:
- 不要使用MSVC开发者命令提示符,打开你平时编译自有项目用的MinGW环境终端,确认终端里可以直接调用
gcc/g++/mingw32-make/cmake命令。 - 在Assimp源码根目录新建独立的
build-mingw文件夹,避免和之前MSVC编译的产物混在一起,进入该文件夹后执行CMake配置命令:
cmake .. -G "MinGW Makefiles" -DASSIMP_BUILD_ASSIMP_TOOLS=OFF -DASSIMP_BUILD_TESTS=OFF -DCMAKE_BUILD_TYPE=Release
- 配置无报错后,执行多线程编译命令:
mingw32-make -j%NUMBER_OF_PROCESSORS%
- 编译完成后,会在输出目录的
lib文件夹下生成MinGW可识别的libassimp.a(静态库)或libassimp.dll.a(动态库导入库),bin文件夹下生成配套的libassimp-*.dll动态库文件。 - 自有项目链接时,把库搜索路径指向编译生成的
lib文件夹,链接参数写-lassimp即可,不要尝试直接链接之前MSVC编译生成的assimp-vc142-mtd.dll。如果用动态库版本,运行时把对应dll放到可执行文件同目录即可。
内容的提问来源于stack exchange,提问作者Boris Vassilev
相关产品推荐
相关产品推荐

