我有两个.so
文件-A.so
和B.so
,其中A.so
需要B.so
。
我使用System.setProperty("java.library.path","thePath");
然后我检查System.out.println(System.getProperty("java.library.path"));
然后我使用A.so
加载System.load("/absolutePath/A.so");
A.so
和B.so
在同一目录中。
我得到的错误是B.so can not find
。
我不能使用LD_LIBRARY_PATH
。
ldd A.so
显示B.so => ./B.so
我也使用System.loadLibrary("A");
,但错误是A can not find
。
答案 0 :(得分:0)
唯一的解决方案可能是:
让ldd
显示绝对路径。
编辑CMakeList.txt
文件:
LINK_DIRECTORIES("/the/absolute/path/")
target_link_libraries(A B.so)
更新:
找到方法,我只给出整个cmake文件的示例。
cmake_minimum_required(VERSION 3.12)
project(xgbtSimiCalcer)
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++0x -fpermissive -m64 -Wl,--no-as-needed -O3 -march=native")
SET(xgbtSimiCalcer_SRC test0.cpp ../test1.cpp)
INCLUDE_DIRECTORIES(./)
INCLUDE_DIRECTORIES(../)
SET(CMAKE_INSTALL_RPATH "\\$ORIGIN")
LINK_DIRECTORIES("${CMAKE_SOURCE_DIR}/../../model/")
LINK_LIBRARIES("${CMAKE_SOURCE_DIR}/../../test.so")
ADD_LIBRARY(xgbtSimiCalcer SHARED ${xgbtSimiCalcer_SRC})
TARGET_LINK_LIBRARIES(xgbtSimiCalcer m.so dl.so pthread.so)
SET(LIBRARY_OUTPUT_PATH "../../tmp")
SET(INSTALL_DIR "${CMAKE_SOURCE_DIR}/../../model_")
INSTALL(TARGETS xgbtSimiCalcer LIBRARY DESTINATION ${INSTALL_DIR})
答案 1 :(得分:0)
java.library.path
仅用于直接从Java加载的库。仅当操作系统本身可以找到依赖库时,才会找到它们。
如果无法使用LD_LIBRARY_PATH并且B不在系统搜索路径中,则必须在A之前使用其绝对路径显式加载B。然后操作系统将在进程内存中找到它。