使用find_package链接assimp库
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了使用find_package链接assimp库相关的知识,希望对你有一定的参考价值。
我正在努力将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包含)
- 这是应该处理find_package链接的assimp-config.cmake(未修改)
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()
,您应该能够简单地将assimp
传递给target_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})
以上是关于使用find_package链接assimp库的主要内容,如果未能解决你的问题,请参考以下文章
你如何告诉 CMake 静态链接到使用 find_package 找到的包中的库?
CMake基础教程(27)find_package搜索包完成库链接和头文件添加(config模式)