c++ - 加载共享库时出错 在辅助依赖项上没有此类文件或目录
问题描述
我在这里检查了所有“加载共享库时出错:”问题,但没有一个对我有帮助。目前,我正在开发现有 C++ Windows 控制台应用程序的 Linux 版本。我正在使用一个名为 JTOpenToolkit 的第 3 方库。我可以编译代码并且链接器没有问题,但显然我不能让 exe 来查找 JTOpenToolkit 使用的共享库的 lib 文件夹。我的层次结构如下所示:
src/
/VSCodeBuild
/lib
libJtTk107.so // library that i use
libJt971.so
libParaSupt971.so
libpskernel.so
libpsbodyshop.so
libpsxttoolkit.so
我将链接库及其依赖项保存在 /lib 文件夹中。我的 cmake 看起来像这样:
cmake_minimum_required(VERSION 3.0.0)
project(JTTest VERSION 0.1.0)
include(CTest)
enable_testing()
set(executable_SOURCES main.cpp)
set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -Wl,-rpath=$ORIGIN/lib")
set(CMAKE_INSTALL_RPATH_USE_LINK_PATH TRUE)
set(JTPath /opt/Siemens/JTOpenToolkit/10_7/dev/lib/linux_64/)
set(JTInclude /opt/Siemens/JTOpenToolkit/10_7/dev/include)
add_executable(JTTest main.cpp)
find_library(JTLIB NAMES libJtTk107.so REQUIRED PATHS ${JTPath})
if(NOT JTLIB)
message([FATAL_ERROR] "JTLIB not found " ${JTPath} )
endif()
target_include_directories(JTTest PUBLIC ${JTInclude})
target_link_libraries(JTTest PRIVATE
${JTLIB}
-lpthread
)
set(CPACK_PROJECT_NAME ${PROJECT_NAME})
set(CPACK_PROJECT_VERSION ${PROJECT_VERSION})
include(CPack)
当我检查时出现ldd
,初始 rpath 设置适用于库 libJtTk107.so,但未检测到其依赖项。
linux-vdso.so.1 (0x00007fff3fb83000)
libJtTk107.so => /home/kanat/Libraries/JTTest/VSCodeBuild/./lib/libJtTk107.so (0x00007fa8c5136000)
libpthread.so.0 => /lib/x86_64-linux-gnu/libpthread.so.0 (0x00007fa8c50ef000)
libstdc++.so.6 => /lib/x86_64-linux-gnu/libstdc++.so.6 (0x00007fa8c4f0d000)
libgcc_s.so.1 => /lib/x86_64-linux-gnu/libgcc_s.so.1 (0x00007fa8c4ef2000)
libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007fa8c4d00000)
libJt971.so => not found
libParaSupt971.so => not found
libpskernel.so => not found
libpsbodyshop.so => not found
libpsxttoolkit.so => not found
libeaiunicode.so => /usr/local/lib/libeaiunicode.so (0x00007fa8c4af4000)
libm.so.6 => /lib/x86_64-linux-gnu/libm.so.6 (0x00007fa8c49a3000)
/lib64/ld-linux-x86-64.so.2 (0x00007fa8c5bae000)
应用程序的运行路径如下所示
RUNPATH $ORIGIN/lib:/opt/Siemens/JTOpenToolkit/10_7/dev/lib/linux_64
我不明白我错过了什么。我想将应用程序与共享库一起发送给客户,并且不想在客户端机器上安装任何第 3 方依赖项。结果,我也无法更新LD_LIBRARY_PATH
。任何想法可能是什么问题?先感谢您。
解决方案
推荐阅读
- reactjs - 如何在 Reactjs 中实现或使用 fabric.Textbox 和 fabric.iText 类?
- java - Apache Tomcat 服务器 OutOfMemoryError
- jquery - 每个事件绑定在动态创建的元素上
- mongodb - 密码标志无法登录 mongo
- c# - 通过 LINQ 嵌套组到嵌套对象
- reactjs - ReactJS 无法在未安装的组件上调用 setState(或 forceUpdate)
- java - 填充Jcombobox模型
- ios - 如何按索引访问特定行
- php - 在linux终端中批量替换字符串
- java - IntellliJ 2018 + Exploded War + Tomcat:过滤 index.html 的问题