【发布时间】:2018-03-03 09:02:06
【问题描述】:
我正在努力将 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
- 这是我的folder structure
- 这是我的CMakeLists.txt 根目录
- 这是我的CMakeLists.txt 用于库链接(通过根 CmakeLists.txt 包含)
- 这是 assimp-config.cmake,应该处理 find_package 链接(未修改)
gcc --version 产生以下结果
gcc (Ubuntu 5.4.0-6ubuntu1~16.04.4) 5.4.0 20160609
CMake 版本为 3.9.6
【问题讨论】:
-
link_directories()只会应用于调用之后创建的目标。所以在你的情况下它没有效果,因为你首先创建你的可执行文件,然后包含lib/CMakeLists.txt。 -
所以顺序应该是link_directories -> add_executable -> target_link_libraries?
-
我想我会制作另一个 FindAssimp.cmake 文件... Bullet 似乎可以很好地链接到与 find_package 链接的相同样式我猜 assimp-config.cmake 文件刚刚损坏
-
这是一个 FindASSIMP.cmake,适用于任何想要将库与相对路径链接而不使用全局 /usr/include /usr/lib 文件夹gist.github.com/Jointts/a02c15002252fea3dd2c6855bda9090b 理论上可以扩展到任何其他库的人好吧。我想编写自己的查找脚本对于 CMake 来说是必须的;(