我正在努力将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)
我首先的问题是,为什么在使用gcc编译项目时,Cmake没有通过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
- 这是我的文件夹结构
- 这是我在根目录下的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
。 - thomas_f