gpt4 book ai didi

cmake - 将 assimp 库与 find_package 链接

转载 作者:行者123 更新时间:2023-12-02 20:50:43 44 4
gpt4 key购买 nike

我正在努力将 Assimp 库与 CMake 的 find_package() 函数链接起来。

# ASSIMP search path
set(CMAKE_PREFIX_PATH ${CMAKE_PREFIX_PATH} ${CMAKE_CURRENT_LIST_DIR}/assimp/)

find_package(assimp REQUIRED)
if (assimp_FOUND)
link_directories(${ASSIMP_LIBRARY_DIRS})
include_directories(${ASSIMP_INCLUDE_DIRS})
target_link_libraries (NervousEngine ${ASSIMP_LIBRARIES})
endif(assimp_FOUND)

我的第一个问题是为什么 Cmake 在使用 gcc 编译项目时没有抛出 find_package() 错误,它说找不到 -lassimp 。当然,当我删除 assimp 目录的 CMAKE_PREFIX_PATH 时,我可能会失败。不知何故,CMake 无法指示编译命令链接它???

第二个问题是为什么库无法链接。这是编译命令以及 ld 链接错误

/usr/bin/c++   -std=gnu++11 -g sourceFiles... o NervousEngine -Wl,-rpath,/home/jointts/CLionProjects/OpenGL/lib/bullet/lib ../lib/bullet/lib/libBulletDynamics.so ../lib/bullet/lib/libBulletCollision.so ../lib/bullet/lib/libLinearMath.so ../lib/bullet/lib/libBulletSoftBody.so -lassimp -lfreetype 
/usr/bin/ld: cannot find -lassimp
collect2: error: ld returned 1 exit status

我只是不明白为什么它没有正确链接,我什至使用 link_directories 指令来指导库搜索。

调试库的路径我得到以下内容

message(${ASSIMP_LIBRARY_DIRS}) -> /home/jointts/CLionProjects/OpenGL/lib/assimp/lib
message(${ASSIMP_LIBRARIES}) -> assimp

所以我认为图书馆位置本身是正确的,这会导致我在下面输入的图书馆搜索?

${ASSIMP_LIBRARY_DIRS} + ${ASSIMP_LIBRARIES}

/home/jointts/CLionProjects/OpenGL/lib/assimp/lib/libassimp.so

gcc --version 产生以下内容

gcc(Ubuntu 5.4.0-6ubuntu1~16.04.4)5.4.0 20160609

CMake版本为3.9.6

最佳答案

1: CMake不会抛出错误,因为它找到了包。您通过成功验证 ASSIMP_* 的值确认了这一点。 -变量。这些变量由 assimp-config.cmake 初始化。 .

2:链接器收到此标志 -lassimp ,这要求链接器知道在哪里寻找库。由于它没有安装在标准位置,因此会失败。在评论中我们讨论了link_libraries()必须在创建依赖于该库的任何目标之前调用。如果您使用link_libraries()在创建目标之前,您应该能够简单地传递 assimptarget_link_libraries() ,它会将其转发给链接器 -lassimp .

更好的解决方案是提供 target_link_libraries()具有 libassimp.so 的绝对路径, target_link_libraries(<target> ${ASSIMP_LIBRARY_DIRS}/libassimp.so) (请注意,我们不在此处为库添加 -l 标志前缀)。不过,请继续阅读。

assimp-config.cmake不创建任何 CMake目标,最干净的解决方案是自己创建一个,如果 CMake能够找到该包:

if (assimp_FOUND)
set(ASSIMP_LIBRARY "assimp")
add_library(${ASSIMP_LIBRARY} SHARED IMPORTED)
set_target_properties(${ASSIMP_LIBRARY} PROPERTIES IMPORTED_LOCATION "${ASSIMP_LIBRARY_DIRS}/libassimp.so")
endif(assimp_FOUND)

然后照常链接到它:target_link_libraries(<target> ${ASSIMP_LIBRARY})

关于cmake - 将 assimp 库与 find_package 链接,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49082471/

44 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com