加载共享库时出错:libcudart.so



你好,不幸的是,我的项目有另一个问题。该项目是一个客户端服务器程序,在两台计算机上使用,一台通过 TCP 向另一台发送图像数据。两台机器都是 Ubuntu 16.04 机器并安装了 OpenCV,但只有一台拥有 CUDA 显卡,因此安装了 CUDA (8.0),并且 OpenCV 在 CUDA 计算机上配置为"WITH_CUDA ON"。 我需要将服务器文件作为可执行文件分发,因为它包含不允许分发的源代码。我现在的目标是构建一个可执行文件,该可执行文件可以分发到计算机(安装了opencv和boost),而与是否安装CUDA无关。 我的最小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 的主机上,程序可以完美构建和运行。在非 CUDA 机器上,我收到错误:

./Server: error while loading shared libraries: libcudart.so.8.0: cannot openshared object file: No such file or directory.

奇怪的是,CUDA 本身并没有被我的代码使用,它似乎是包含 CUDA 库但不分发它的 OpenCV。任何人都可以帮助我使用CMakeLists.txt使Cmake分发libcudart.so.8.0或更好的功能以在可执行文件中静态链接它吗? 如何检查哪些库是真正静态链接的?ldd Server提供包含所有依赖项的列表,OpenCV 不会发生,但会提升。这意味着boost是动态链接的,OpenCV是静态的,对吧?那么,如何通过静态链接来提升呢?

非常感谢您的再次帮助。

编辑1:与此同时,我试图遵循您的评论,可以将libcudart.so.8.0复制到非CUDA计算机,并以这种方式运行程序。但我真的很想知道如何创建一个静态链接 CUDA 库的 Cmake 项目,这样就不必手动复制它。不幸的是,链接的 CUDA 文档对我没有帮助,我无法管理它。

好的,终于我想通了,解决了问题。最后,您的评论将我引向解决方案。我只是忘记明确指定 CUDA 库,我不知道我必须这样做。 我变了

target_link_libraries( Server ${OpenCV_LIBS} ${Boost_LIBRARIES} Spinnaker )

target_link_libraries( Server ${OpenCV_LIBS} ${Boost_LIBRARIES} Spinnaker ${CUDA_LIBRARIES} )

如评论中所述,现在默认情况下它是静态链接的。

相关内容

最新更新