首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >在Mac M1上用CLion在Cmake项目中添加assimp

在Mac M1上用CLion在Cmake项目中添加assimp
EN

Stack Overflow用户
提问于 2021-10-06 13:46:43
回答 1查看 755关注 0票数 1

从一周以来,我一直试图将assimp库包含到我的OpenGL项目中,但没有成功。我使用Mac M1并得到以下错误

代码语言:javascript
运行
复制
Undefined symbols for architecture arm64:
  "Assimp::Importer::ReadFile(char const*, unsigned int)", referenced from:
      Assimp::Importer::ReadFile(std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const&, unsigned int) in Model.cpp.o
  "Assimp::Importer::Importer()", referenced from:
      Model::loadModel(std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >) in Model.cpp.o
  "Assimp::Importer::~Importer()", referenced from:
      Model::loadModel(std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >) in Model.cpp.o
  "Assimp::Importer::GetErrorString() const", referenced from:
      Model::loadModel(std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >) in Model.cpp.o
  "_aiGetMaterialTexture", referenced from:
      aiMaterial::GetTexture(aiTextureType, unsigned int, aiString*, aiTextureMapping*, unsigned int*, float*, aiTextureOp*, aiTextureMapMode*) const in Model.cpp.o
  "_aiGetMaterialTextureCount", referenced from:
      aiMaterial::GetTextureCount(aiTextureType) const in Model.cpp.o
ld: symbol(s) not found for architecture arm64
clang: error: linker command failed with exit code 1 (use -v to see invocation)
make[3]: *** [opengl_tuto] Error 1
make[2]: *** [CMakeFiles/opengl_tuto.dir/all] Error 2
make[1]: *** [CMakeFiles/opengl_tuto.dir/rule] Error 2
make: *** [opengl_tuto] Error 2

这是我的CmakeLists.txt:

代码语言:javascript
运行
复制
cmake_minimum_required(VERSION 3.19)
project(opengl_tuto)

set(CMAKE_CXX_STANDARD 14)

add_executable(opengl_tuto src/main.cpp
        src/Shader.cpp src/Shader.h
        src/CubeTexture.cpp src/CubeTexture.h
        src/Camera.cpp src/Camera.h
        src/entity/Cube.cpp src/entity/Cube.h
        src/Mesh.cpp src/Mesh.h src/Model.cpp src/Model.h)

if(APPLE)
    set(OPENGL_MAC_DIR /Library/Developer/CommandLineTools/SDKs/MacOSX.sdk/System/Library/Frameworks/OpenGL.framework/Versions/A/Headers/)
    target_include_directories(${PROJECT_NAME} PRIVATE ${OPENGL_MAC_DIR})
else()
    find_package(OpenGL REQUIRED)
    set(LIBS OpenGL)
    # Define the link libraries
    target_include_directories(${PROJECT_NAME} PUBLIC ${LIBS})
    target_link_libraries(${PROJECT_NAME} ${LIBS})
endif()
set(LIB_DIR "${CMAKE_CURRENT_SOURCE_DIR}/libs/thirdparty")

#GLFW
set(GLFW_DIR ${LIB_DIR}/glfw)

set(GLFW_BUILD_EXAMPLES OFF CACHE INTERNAL "Build the GLFW example programs")
set(GLFW_BUILD_TESTS OFF CACHE INTERNAL "Build the GLFW test programs")
set(GLFW_BUILD_DOCS OFF CACHE INTERNAL "Build the GLFW documentation")
set(GLFW_INSTALL OFF CACHE INTERNAL "Generate installation target")

add_subdirectory(${GLFW_DIR})
target_link_libraries(${PROJECT_NAME} glfw ${GLFW_LIBRARIES})
target_include_directories(${PROJECT_NAME} PRIVATE ${GLFW_DIR}/include)
include_directories(${GLFW_DIR}/include)


set(ASSIMP_DIR ${LIB_DIR}/assimp/)
add_subdirectory(${ASSIMP_DIR})
include_directories(${ASSIMP_DIR}/include)

#glad
set(GLAD_DIR ${LIB_DIR}/glad)
add_library("glad" ${GLAD_DIR}/src/glad.c src/entity/Cube.cpp src/entity/Cube.h)
target_include_directories(glad PRIVATE ${GLAD_DIR}/include)
target_include_directories(${PROJECT_NAME} PRIVATE ${GLAD_DIR}/include)
target_link_libraries(${PROJECT_NAME} "glad" "${CMAKE_DL_LIBS}")

set(STB_DIR ${LIB_DIR}/stb_image)
add_library(stb_image ${STB_DIR}/stb_image.cpp)
target_include_directories(stb_image PRIVATE ${STB_DIR})
target_include_directories(${PROJECT_NAME} PRIVATE ${STB_DIR})
include_directories(${STB_DIR})
target_link_libraries(${PROJECT_NAME} "stb_image" "${CMAKE_DL_LIBS}")

set(GLM_DIR ${LIB_DIR}/glm)
#add_package(glm ${GLM_DIR})
include_directories(${GLM_DIR})

要包含assimp库,我已经下载了github页面上的zip文件(Version5.0.1),将其解压到我的项目的libs/ make文件夹中,启动make命令和make one。我对cmake不太熟悉,所以在编译过程中可能犯了一个错误。

我看到有一个版本的这个库可以通过家庭酿造,但我无法使它工作。

有谁知道如何解决这个问题吗?

提前感谢莱克斯

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2021-10-06 20:16:41

如果您通过CMakeLists.txt通过add_subdirectory将assimp项目包含到您的assimp中,那么它将创建assimp目标,该目标包含了关于Assimp的所有知识。

因此,它的用法很简单:

代码语言:javascript
运行
复制
# That line handles both library linking and assimp include directories.
target_link_libraries(opengl_tuto assimp)

或者,您可以使用别名目标assimp::assimp来代替“正常”assimp目标。

代码语言:javascript
运行
复制
target_link_libraries(opengl_tuto assimp::assimp)

使用别名目标有以下优点:

  1. CMake自动检查目标 assimp::assimp的存在,如果不存在,则发出错误。(如果您链接到assimp目标,而给定的目标不存在,那么CMake只是将-lassimp选项传递给链接器。
  2. 会将您的项目转换为使用find_package(assimp)而不是add_subdirectory方法,链接保持不变。(使用find_package方法,没有创建assimp目标)。
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/69466967

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档