如何将C程序与assimp MinGW-w64链接

问题描述 投票:0回答:1

我从 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 static-linking mingw-w64 assimp
1个回答
0
投票

请原谅我的墓碑。万一有人像我一样使用 C 并需要 ASSIMP。 您可以使用 CMake 在“build”目录中构建 ASSIMP。自己创建“build”目录。

我使用 Ninja 构建系统(我更喜欢这个)

在 ASSIMP 目录中执行此操作

  1. mkdir 构建
  2. cd 构建
  3. cmake -G“忍者”..
  4. 忍者

在 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(); 显式转换是可选的,但读起来更清晰。

© www.soinside.com 2019 - 2024. All rights reserved.