加载共享库时出错:libcudart.so
Error while loading shared libraries: libcudart.so
你好,不幸的是我的项目还有另一个问题。该项目是一个客户端服务器程序,在两台机器上使用,一台通过 TCP 向另一台发送图像数据。两台机器都是 Ubuntu 16.04 机器,都安装了 OpenCV,但只有一台拥有 CUDA 显卡,因此安装了 CUDA (8.0),并且 OpenCV 在 CUDA 计算机上配置为 "WITH_CUDA ON"。
我需要将服务器文件分发为可执行文件,因为它包含我不允许分发的源代码。我现在的目标是构建一个可执行文件,它可以独立于是否安装 CUDA 分发到计算机(安装了 opencv 和 boost)。
我的最小 CmakeLists.txt
如下所示:
cmake_minimum_required( VERSION 3.10.0 FATAL_ERROR )
project( Testproject )
# Set c++ standard 11 flag -----------------------------------------------------------------------------------
if( UNIX )
SET( CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wall -std=c++11" )
endif()
# Find and include opencv ------------------------------------------------------------------------------------
set ( OpenCV_DIR /opt/opencv/opencv-3.0/share/OpenCV )
set( OpenCV_FIND_QUIETLY FALSE )
find_package( OpenCV 3.0 REQUIRED )
include_directories( ${OpenCV_INCLUDE_DIRS} )
# Find Boost package -----------------------------------------------------------------------------------------
find_package( Boost COMPONENTS log log_setup thread system program_options REQUIRED )
include_directories( ${Boost_INCLUDE_DIRS} )
# Find Thread package ----------------------------------------------------------------------------------------
find_package( Threads )
add_executable( Server src/Server.cpp )
target_include_directories(Server PUBLIC /usr/include/spinnaker
PRIVATE ./src/
PRIVATE ../build/ )
target_link_libraries( Server ${OpenCV_LIBS} ${Boost_LIBRARIES} Spinnaker )
在安装了 CUDA 的主机上,程序构建和 运行s 完美。在非 CUDA 机器上我得到错误:
./Server: error while loading shared libraries: libcudart.so.8.0: cannot openshared object file: No such file or directory.
奇怪的是,CUDA 本身并没有被我的代码使用,似乎是 OpenCV 包含了 CUDA 库但没有分发它。任何人都可以帮助我 CMakeLists.txt 让 Cmake 在可执行文件中静态分发 libcudart.so.8.0 或更好的 link 吗?
我如何检查哪些库是真正 link 静态编辑的? ldd Server
提供了一个包含所有依赖项的列表,OpenCV 没有出现,但是 boost。这意味着 boost 是动态 linked 而 OpenCV 是静态的,对吧?那么 boost 如何也被静态 linked 呢?
再次感谢您的帮助。
编辑 1:与此同时,我尝试按照您的意见进行操作,并且可以将 libcudart.so.8.0
复制到非 CUDA 计算机,并以这种方式 运行 程序。但我真的很想知道如何创建一个静态 links CUDA 库的 Cmake 项目,这样它就不必手动复制了。不幸的是,linked CUDA 文档对我没有帮助,我无法管理它。
好吧,我终于想通了,解决了问题。最后,您的评论使我找到了解决方案。我只是忘了明确指定 CUDA 库,我不知道我必须这样做。
我变了
target_link_libraries( Server ${OpenCV_LIBS} ${Boost_LIBRARIES} Spinnaker )
至
target_link_libraries( Server ${OpenCV_LIBS} ${Boost_LIBRARIES} Spinnaker ${CUDA_LIBRARIES} )
如评论中所述,现在默认为静态链接。
你好,不幸的是我的项目还有另一个问题。该项目是一个客户端服务器程序,在两台机器上使用,一台通过 TCP 向另一台发送图像数据。两台机器都是 Ubuntu 16.04 机器,都安装了 OpenCV,但只有一台拥有 CUDA 显卡,因此安装了 CUDA (8.0),并且 OpenCV 在 CUDA 计算机上配置为 "WITH_CUDA ON"。
我需要将服务器文件分发为可执行文件,因为它包含我不允许分发的源代码。我现在的目标是构建一个可执行文件,它可以独立于是否安装 CUDA 分发到计算机(安装了 opencv 和 boost)。
我的最小 CmakeLists.txt
如下所示:
cmake_minimum_required( VERSION 3.10.0 FATAL_ERROR )
project( Testproject )
# Set c++ standard 11 flag -----------------------------------------------------------------------------------
if( UNIX )
SET( CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wall -std=c++11" )
endif()
# Find and include opencv ------------------------------------------------------------------------------------
set ( OpenCV_DIR /opt/opencv/opencv-3.0/share/OpenCV )
set( OpenCV_FIND_QUIETLY FALSE )
find_package( OpenCV 3.0 REQUIRED )
include_directories( ${OpenCV_INCLUDE_DIRS} )
# Find Boost package -----------------------------------------------------------------------------------------
find_package( Boost COMPONENTS log log_setup thread system program_options REQUIRED )
include_directories( ${Boost_INCLUDE_DIRS} )
# Find Thread package ----------------------------------------------------------------------------------------
find_package( Threads )
add_executable( Server src/Server.cpp )
target_include_directories(Server PUBLIC /usr/include/spinnaker
PRIVATE ./src/
PRIVATE ../build/ )
target_link_libraries( Server ${OpenCV_LIBS} ${Boost_LIBRARIES} Spinnaker )
在安装了 CUDA 的主机上,程序构建和 运行s 完美。在非 CUDA 机器上我得到错误:
./Server: error while loading shared libraries: libcudart.so.8.0: cannot openshared object file: No such file or directory.
奇怪的是,CUDA 本身并没有被我的代码使用,似乎是 OpenCV 包含了 CUDA 库但没有分发它。任何人都可以帮助我 CMakeLists.txt 让 Cmake 在可执行文件中静态分发 libcudart.so.8.0 或更好的 link 吗?
我如何检查哪些库是真正 link 静态编辑的? ldd Server
提供了一个包含所有依赖项的列表,OpenCV 没有出现,但是 boost。这意味着 boost 是动态 linked 而 OpenCV 是静态的,对吧?那么 boost 如何也被静态 linked 呢?
再次感谢您的帮助。
编辑 1:与此同时,我尝试按照您的意见进行操作,并且可以将 libcudart.so.8.0
复制到非 CUDA 计算机,并以这种方式 运行 程序。但我真的很想知道如何创建一个静态 links CUDA 库的 Cmake 项目,这样它就不必手动复制了。不幸的是,linked CUDA 文档对我没有帮助,我无法管理它。
好吧,我终于想通了,解决了问题。最后,您的评论使我找到了解决方案。我只是忘了明确指定 CUDA 库,我不知道我必须这样做。 我变了
target_link_libraries( Server ${OpenCV_LIBS} ${Boost_LIBRARIES} Spinnaker )
至
target_link_libraries( Server ${OpenCV_LIBS} ${Boost_LIBRARIES} Spinnaker ${CUDA_LIBRARIES} )
如评论中所述,现在默认为静态链接。