JNI共享库中未定义的符号,可执行文件正在工作
Undefined symbol in shared library for JNI, executable is working
我真的没有经验,当它涉及到c++,所以我希望这只是一个小错误,导致这个错误。对不起,这篇文章太长了,但我尽量把所有重要的细节都包括在内。
所以这就是我要做的:我正在使用一个外部库,它以两个文件夹的形式出现,每个文件夹都有一个makefile。我试图创建一个JNI库与一个额外的cpp文件和JNI头在一个。h文件。
文件夹结构是这样的:-> libcds/src创建一个makefile,创建libcds.a
-> SSA2和创建SSA.a的makefile
-> myFolder,里面有我的cpp和h文件,还有一个makefile,用来创建库
libcds/src:
CPP=g++
CPPFLAGS=-O9 -w -DNDEBUG
INCL=-I../includes/
CODERS_DIR=coders
CODERS_OBJECTS=$(CODERS_DIR)/huff.o $(CODERS_DIR)/huffman_codes.o
STATIC_PERMUTATION_DIR=static_permutation
STATIC_PERMUTATION_OBJECTS=$(STATIC_PERMUTATION_DIR)/perm.o ...
STATIC_BITSEQUENCE_DIR=static_bitsequence
STATIC_BITSEQUENCE_OBJECTS=$(STATIC_BITSEQUENCE_DIR)/static_bitsequence.o ..
STATIC_SEQUENCE_DIR=static_sequence
STATIC_SEQUENCE_OBJECTS=$(STATIC_SEQUENCE_DIR)/static_sequence.o, ..., wt_coder.o
UTILS_DIR=utils
UTILS_OBJECTS=$(UTILS_DIR)/alphabet_mapper_none.o $(UTILS_DIR)/alphabet_mapper.o
%.o: %.cpp
$(CPP) $(CPPFLAGS) $(INCL) -c $< -o $@
all: lib
lib: pre $(CODERS_OBJECTS) $(STATIC_BITSEQUENCE_OBJECTS) $(STATIC_SEQUENCE_OBJECTS) $(UTILS_OBJECTS) $(STATIC_PERMUTATION_OBJECTS)
ar rcs ../lib/libcds.a $(CODERS_OBJECTS) $(STATIC_BITSEQUENCE_OBJECTS) $(STATIC_SEQUENCE_OBJECTS) $(UTILS_OBJECTS) $(STATIC_PERMUTATION_OBJECTS)
pre:
cp basics.h ../includes/
cp */*.h ../includes/
SSA2:
CC=g++
CFLAGS=-w -O9 -DNDEBUG -I../libcds/includes/
CODERS_DIR=../libcds/src/coders
CODERS_OBJECTS=$(CODERS_DIR)/huff.o $(CODERS_DIR)/huffman_codes.o
STATIC_BITSEQUENCE_DIR=../libcds/src/static_bitsequence
STATIC_BITSEQUENCE_OBJECTS=$(STATIC_BITSEQUENCE_DIR)/static_bitsequence.o ...
STATIC_SEQUENCE_DIR=../libcds/src/static_sequence
STATIC_SEQUENCE_OBJECTS=$(STATIC_SEQUENCE_DIR)/static_sequence.o ...
UTILS_DIR=../libcds/src/utils
UTILS_OBJECTS=$(UTILS_DIR)/alphabet_mapper_none.o $(UTILS_DIR)/alphabet_mapper.o
all: index
# pattern rule for all objects files
%.o: %.c *.h
$(CC) -c $(CFLAGS) $< -o $@
%.o: %.cpp *.h
$(CC) -c $(CFLAGS) $< -o $@
index: bitrankw32int.o bitarray.o ds/ds.o ds/globals.o ds/helped.o ds/shallow.o ds/deep2.o ds/blind2.o SSA.o
cp ../libcds/lib/libcds.a SSA.a
ar rcs SSA.a SSA.o bitrankw32int.o bitarray.o ds/ds.o ds/globals.o ds/shallow.o ds/helped.o ds/deep2.o ds/blind2.o
我的makefile。
CC=g++ -I $(JAVA_HOME)/include -I $(JAVA_HOME)/include/linux
LD_LIBRARY_PATH=./
JNI_NAME= indexlib
all: test
%.o: %.c *.h
$(CC) -c $(CFLAGS) $< -o $@
test_index:
$(CC) run_queries.c -o testIndex SSA.a
test_index_lib: run_queries.o
ld -shared -soname lib$(JNI_NAME).so -o lib$(JNI_NAME).so run_queries.o SSA.a -lc
可执行的testIndex工作正常。然而,结果库不能被Java加载,并显示错误消息:
未定义符号:_ZNSt8ios_base4InitC1Ev
当我使用nm来查找该符号时,我得到以下结果:
000131b0 w_zn8wt_coderd2ev
U _ZNKSt5ctypeIcE13_M_widen_initEv
U _ZNSo3putEc
U _ZNSo5flushEv
U _ZNSo9_M_insertImEERSoT_
U _ZNSt8ios_base4InitC1Ev
U _ZNSt8ios_base4InitD1Ev
U _ZSt16__ostream_insertIcSt11char_traitsIcEERSt13basic_ostreamIT_T0_ES6_PKS3_i
U _ZSt16__throw_bad_castv
U _ZSt4cout加上——demangle,它看起来是这样的:000131b0 Wwt_coder:: ~ wt_coder ()
U std::ctype::_M_widen_init() const
U std::上ostream::把(char)
U std::上ostream::冲洗()
U std:: ostream&std::上ostream:: _M_insert(无符号长)
U std:: ios_base:: Init:: Init ()
U std:: ios_base:: Init:: ~ Init ()
U std::basic_ostream>&std:: __ostream_insert(std::basic_ostream>&, char const*, int)U std:: __throw_bad_cast ()
U std:: cout
所以实际上这可能与链接器错误有关:对' std::ctype
我认为你没有链接到c++标准库。你需要它,因为你要链接的库之一是c++。
在第一种情况下(目标test_index),一切工作正常,因为您使用g++
来编译和链接,它将隐式链接到libstdc++。在共享库的情况下,你链接的是ld
,它不会隐式链接libstdc++。
您可以使用g++
编译和链接共享库,也可以使用-lstdc++
显式添加libstdc++。
所以问题最终变得很简单:我必须使用g++来创建库,而不是使用ld
- 如何将不同的可执行文件合并到一个窗口框架中进行编码?像浏览器一样
- 如何使 windows 命令提示符在C++可执行文件上显示返回值?
- CMake:如何将库 A 链接到库 B,然后将可执行文件链接到库 A
- 如何使字符串出现在编译的二进制可执行文件的开头?
- 程序在使用 system() 启动另一个可执行文件时停止
- 如何更改使用 CPack 安装的可执行文件的名称?
- 在Linux上使用Clang / OLLVM交叉编译helloworld Windows可执行文件时的问题
- CMake:我们可以为一组不形成可执行文件或库的特定文件指定包含目录吗?
- 如何将图像传入C++可执行文件并将输出图像存储在新目录中?
- 共享库 (.so) 没有扩展名的 Linux 可执行文件之间的区别?
- 如何在 linux 可执行文件中使用静态库
- 错误:当我从"WinDbg"打开可执行文件时,找不到符号文件。默认导出 ntdll 的符号.dll
- 无法使用 Visual Studio 启动 DirectX 11 可执行文件,生成工作正常
- 为什么将可执行文件重命名为临时文件的此代码段不能按预期工作?
- C 可执行文件不从文件夹工作,而是在Mac上从控制台上工作
- 创建不需要任何进一步安装即可在其他计算机上工作的可执行文件?
- 可执行文件无法正常工作 [Linux]
- VIsual C++可执行文件不工作
- 如何从节点在Heroku上运行可执行文件,在本地工作
- JNI共享库中未定义的符号,可执行文件正在工作