将 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
- 这是我的folder structure
- 这是我的 CMakeLists.txt
根目录
- 这是我的 CMakeLists.txt 库 linking(通过 root CmakeLists.txt 包含)
- 这是 assimp-config.cmake 应该处理 find_package linking(未修改)
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.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)
然后link照常进行:target_link_libraries(<target> ${ASSIMP_LIBRARY})
我正在努力使用 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
- 这是我的folder structure
- 这是我的 CMakeLists.txt 根目录
- 这是我的 CMakeLists.txt 库 linking(通过 root CmakeLists.txt 包含)
- 这是 assimp-config.cmake 应该处理 find_package linking(未修改)
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.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)
然后link照常进行:target_link_libraries(<target> ${ASSIMP_LIBRARY})