【问题标题】:Assimp linker error - undefined referencesAssimp 链接器错误 - 未定义的引用
【发布时间】:2013-04-04 04:11:59
【问题描述】:

我最近一直在尝试安装Assimp 3.0 以从Blender 加载模型以在OpenGL 中使用。

我的项目设置在Sublime Text 3 中,因此我创建了CMake 文件来生成所需的make 文件供我构建项目。

我正在使用的所有其他库,例如 SFML,都被包含并正常链接,但由于某种原因 Assimp 无法正常工作。

在构建时,我收到以下链接器错误:

undefined reference to `Assimp::Importer::Importer()
undefined reference to `Assimp::Importer::~Importer()
undefined reference to `Assimp::Importer::~Importer()

由于这是一个链接器错误,我假设我的问题在于我的 CMake 文件。

我创建了一个FindASSIMP.cmake 文件来为我设置一些变量,其中包含正确的包含目录和需要链接的.lib 文件的路径,我可以看到它工作正常,因为我可以打印结果变量并获得预期的输出。

我有两个变量 ${ASSIMP_INCLUDE_DIR}${ASSIMP_LIBRARY}

release 构建中:

${ASSIMP_INCLUDE_DIR} = C:/lib/assimp/3.0/include
${ASSIMP_LIBRARY} = C:/lib/assimp/3.0/lib/assimp_release-dll_win32/assimp.lib

我的主要CMake 文件将所有内容组合在一起,如下所示(删除了很​​多不相关的内容):

set(EXE "main")

# Add sub-directories to create libraries from my files
add_subdirectory(various_sub_dirs)

add_executable(${EXE} my_sources.cpp)

# Link up my sub-directory libraries
target_link_libraries(${EXE} various_libraries_from_my_code)

# Link up external libraries
target_link_libraries(${EXE} ${ASSIMP_LIBRARY})
target_link_libraries(${EXE} ${GLEW_LIBRARIES})
target_link_libraries(${EXE} ${GLUT_LIBRARY})
target_link_libraries(${EXE} ${OPENGL_LIBRARIES})
# etc...

我没有收到任何include 错误,所以我知道inlcude directory 使用正确,但出于某种原因,即使我可以打印出我正在链接的.lib 文件的确切路径,它要么实际上没有链接,要么我链接了错误的东西。

有人知道我为什么会看到这些链接器错误吗?

我需要链接不同的文件吗?或者我可能需要按特定顺序链接它?

任何帮助将不胜感激,因为我看不出我做错了什么。

如果需要更多信息,请发表评论,我会尽快编辑问题。

【问题讨论】:

  • 你是如何构建这个的?您是否检查过链接命令中是否列出了 C:/lib/assimp/3.0/lib/assimp_release-dll_win32/assimp.lib?
  • @Fraser 我正在通过使用 CMake 生成的 make 文件在 Windows 7 上使用 MinGW 进行构建。我刚刚为 make 命令打开了 VERBOSE=1,我可以看到 .lib 文件的路径包含在与 g++ 的链接阶段。我可以看到的输出基本上是这样的(...是我省略的地方):“C:\mingw_path\g++.exe -std=c++11 -Wall ... -o C:\bin_path\main. exe ... C:\lib\assimp\3.0\lib\assimp_release-dll_win32\assimp.lib ..."。我曾尝试使用 assimp.lib、Assimp32.dll 和 Assimp64.dll 文件,但它们都给出相同的结果(实际上 x64 dll 无法识别)。
  • 恐怕我对MinGW不太熟悉。我唯一的建议是尝试最后链接 assimp,以防其他库之一将其作为依赖项。只需尝试将 target_link_libraries(${EXE} ${ASSIMP_LIBRARY}) 移动到所有 target_link_libraries 调用的末尾即可。
  • @Fraser 谢谢你的时间,但似乎问题出在下载附带的预编译文件上。我刚刚用 CMake 和 Make 自己编译了库文件,然后使用了这些文件,现在它可以正常工作了。

标签: c++ build linker cmake assimp


【解决方案1】:

问题出在 Assimp 3.0 完整下载附带的预编译库中。

我使用 CMake 和 Make 自己编译了 Assimp 库,现在它可以正常工作了。

【讨论】:

  • 你能详细说明你是如何做到这一点的吗?当我尝试使用 CMake 和 VS2013 进行编译时,我得到一个具有未解析方法的 .exe(使用 Dependency Walker 检查)。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-01-23
  • 2012-10-16
  • 2012-11-22
  • 2022-01-01
  • 2016-07-21
  • 2012-05-29
相关资源
最近更新 更多