我从 assimp 站点复制了一个基本的 assimp 示例(进行了一些小的修改以使其与 C 一起工作)。现在的问题是,当它尝试链接时,assimp 抱怨它找不到
::operator delete(void*)
或 std::allocator
或许多其他 C++ 东西。 Assimp 应该使用普通的 C 接口,所以它不应该有这个问题,对吧?
另一个注意事项:这是使用静态链接的assimp v3.3.1,使用相同的MinGW-w64编译器编译。
这是我导致错误的示例代码:
#include <assimp/cimport.h>
#include <assimp/scene.h>
#include <assimp/postprocess.h>
int DoImport(const char* pFile){
const struct aiScene* s = aiImportFile(pFile,
aiProcess_CalcTangentSpace |
aiProcess_Triangulate |
aiProcess_JoinIdenticalVertices |
aiProcess_SortByPType);
if(!s)
return 0;
return 1;
}
int main(){}
以下是一些错误示例:
C:/MinGW/bin/../lib/gcc/i686-w64-mingw32/6.2.0/../../../../i686-w64-mingw32/lib/
../lib/libassimp.a(ImporterRegistry.cpp.obj):ImporterRegistry.cpp:(.text$_ZNSt6v
ectorIPN6Assimp12BaseImporterESaIS2_EE19_M_emplace_back_auxIJS2_EEEvDpOT_[__ZNSt
6vectorIPN6Assimp12BaseImporterESaIS2_EE19_M_emplace_back_auxIJS2_EEEvDpOT_]+0x71):
undefined reference to `operator delete(void*)'
C:/MinGW/bin/../lib/gcc/i686-w64-mingw32/6.2.0/../../../../i686-w64-mingw32/lib/
../lib/libassimp.a(DefaultIOSystem.cpp.obj):DefaultIOSystem.cpp:(.text+0x818):
undefined reference to `std::__cxx11::basic_string<char, std::char_traits<char>,
std::allocator<char> >::_M_create(unsigned int&, unsigned int)'
请原谅我的墓碑。万一有人像我一样使用 C 并需要 ASSIMP。 您可以使用 CMake 在“build”目录中构建 ASSIMP。自己创建“build”目录。
我使用 Ninja 构建系统(我更喜欢这个)
在 ASSIMP 目录中执行此操作
在 build/bin 中,您应该会看到一个您需要的 lib-assimp5.dll 文件! 将此 .dll 文件拖到可执行文件所在的构建目录中。
转到您的 CMakeLists.txt 和 target_link_libraries({$PROJECT_SOURCE_DIR}path/to/lib-assimp5.dll)
如果您所做的一切正确,ASSIMP 应该可以工作!
更不用说检查 assimp/include/defs.h defs.h:包含 C 类型的定义
例如这一行:const struct aiScene * 应该这样写
const C_STRUCT aiScene * = (const C_STRUCT aiScene *)aiImportFile(); 显式转换是可选的,但读起来更清晰。