1
我是C++新手,嘗試編譯.so文件以通過Java中的JNI運行它。JNI/C++編譯問題
的C的目錄結構++文件夾是:
/
/lib/ - this contains a .a file = library.a below
/folder1 - this contains the .cpp .h and .o files
方案1:
我運行了以下內容:
g++ -std=c++11 -I$JAVA_HOME/include -Ifolder1/ -I$JAVA_HOME/include/linux -o outputFileName.so inputFileName.cpp -Llib -llibrary.a -fPIC -shared
我收到以下錯誤:
relocation R_X86_64_32 against '.rodata.str1.1' can not be used when making a shared object; recompile with -fPIC
所有文件和.so對象都有-fPIC標誌。有什麼問題?
方案2:
我運行了以下內容:
g++ -std=c++11 -I$JAVA_HOME/include -Ifolder1/ -I$JAVA_HOME/include/linux -o outputFileName.so inputFileName.cpp -shared
因此,沒有-L和-l標誌。
我得到.so文件,並將其放在/ usr/lib中,其中的相關命名即「lib」前綴。當我運行Java程序,我得到:
symbol lookup error: /usr/lib/outputFileName.so: undefined symbol: _ZN3...
我用C++ filt的反編譯的符號,我得到這樣一個類的引用:
namespace::Class::Constructor
我檢查的.cpp文件類和構造函數存在。
請幫忙嗎?
請發佈所有用於構建庫的命令。此外,這個問題可能應該分成兩個單獨的問題。 –
瘋狂的猜測,但也許一些名稱mangling的問題 - 函數聲明你是從JAVA運行包裹在外部「C」塊? –