将 assimp 库链接到 find_package

Linking assimp library with find_package

我正在努力使用 CMake 的 find_package() 函数 linking Assimp 库。

# 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 无法指示编译命令 link 它???

第二个问题是为什么库不能link编辑。这是编译命令以及 ld linking error

/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 不正确我什至使用 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: linker 收到此标志 -lassimp,这要求 linker 知道在哪里寻找图书馆.由于它未安装在标准位置,因此会失败。在我们讨论的评论中,必须在创建依赖于库的任何目标之前调用 link_libraries()。如果您在创建目标之前使用 link_libraries(),您应该能够简单地将 assimp 传递给 target_link_libraries(),它会将它作为 [=14] 转发给 linker =].

更好的解决方案是为 target_link_libraries() 提供 libassimp.sotarget_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)

然后link照常进行:target_link_libraries(<target> ${ASSIMP_LIBRARY})