2014-02-05 6 views
0

Я пытаюсь связать библиотеку в проекте JNI, который у меня есть. Я столкнулся с странной ошибкой, когда вывод консоли говорит мне, что существует «символ, не найденный для архитектуры x86 64». Я немного озадачен тем, что может пойти не так. Есть и другие классы, но их слишком много, чтобы положить сюда. Вот мой код:Символ не найден при связывании библиотеки

EDIT: Я включу весь журнал отладки консоли. В нем не упоминается, какой символ является тем, о котором идет речь.

EDIT 2: Я исправил статическую переменную, которая была проблемой, но она все еще дает ошибку. Обновленный код, чтобы отразить изменения

Консоль отладки Вход:

14:24:05 **** Build of configuration Debug for project HPA* Program **** 
make all 
cc -v -c -stdlib=libstdc++ -fPIC -I/System/Library/Frameworks/JavaVM.framework/Versions/A/Headers/ HPAProgram.c++ -o libhpaprogram.o 
Apple LLVM version 5.0 (clang-500.2.79) (based on LLVM 3.3svn) 
Target: x86_64-apple-darwin13.0.0 
Thread model: posix 
"/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/clang" -cc1 -triple x86_64-apple-macosx10.9.0 -emit-obj -mrelax-all -disable-free -disable-llvm-verifier -main-file-name HPAProgram.c++ -mrelocation-model pic -pic-level 2 -mdisable-fp-elim -masm-verbose -munwind-tables -target-cpu core2 -target-linker-version 224.1 -v -coverage-file "/Users/zalbhathena/Documents/workspace/Thesis-Test-Application/HPA* Program/jni/libhpaprogram.o" -resource-dir /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/../lib/clang/5.0 -I /System/Library/Frameworks/JavaVM.framework/Versions/A/Headers/ -stdlib=libstdc++ -fdeprecated-macro -fdebug-compilation-dir "/Users/zalbhathena/Documents/workspace/Thesis-Test-Application/HPA* Program/jni" -ferror-limit 19 -fmessage-length 0 -stack-protector 1 -mstackrealign -fblocks -fobjc-runtime=macosx-10.9.0 -fobjc-dispatch-method=mixed -fobjc-default-synthesize-properties -fencode-extended-block-signature -fcxx-exceptions -fexceptions -fdiagnostics-show-option -o libhpaprogram.o -x c++ HPAProgram.c++ 
clang -cc1 version 5.0 based upon LLVM 3.3svn default target x86_64-apple-darwin13.0.0 
ignoring nonexistent directory "/usr/include/c++/4.2.1/i686-apple-darwin10/x86_64" 
ignoring nonexistent directory "/usr/include/c++/4.0.0" 
ignoring nonexistent directory "/usr/include/c++/4.0.0/i686-apple-darwin8/" 
ignoring nonexistent directory "/usr/include/c++/4.0.0/backward" 
ignoring nonexistent directory "/usr/local/include" 
#include "..." search starts here: 
#include <...> search starts here: 
/System/Library/Frameworks/JavaVM.framework/Versions/A/Headers 
/usr/include/c++/4.2.1 
/usr/include/c++/4.2.1/backward 
/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/../lib/clang/5.0/include 
/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/include 
/usr/include 
/System/Library/Frameworks (framework directory) 
/Library/Frameworks (framework directory) 
End of search list. 
libtool -dynamic -lSystem libhpaprogram.o -o libhpaprogram.dylib 
ld: warning: -macosx_version_min not specified, assuming 10.8 
Undefined symbols for architecture x86_64: 
    "__Z11create_dcdtv", referenced from: 
     _Java_HPAProgram_sayHello in libhpaprogram.o 
ld: symbol(s) not found for architecture x86_64 
/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/libtool: internal link edit command failed 
make: *** [libhpaprogram.dylib] Error 1 

14:24:05 Build Finished (took 162ms) 

HPAProgram.C++

#include <stdio.h> 
#include "HPAProgram.h" 
#include "DCDTWrapper.h" 

extern void create_dcdt(); 
JNIEXPORT void JNICALL Java_HPAProgram_sayHello (JNIEnv *env, jobject obj) { 
    printf("Hello World!\n"); 
    create_dcdt(); 
} 

DCDTWrapper.h

# include "DCDTsrc/se_dcdt.h" 
# include "DCDTsrc/gs_polygon.h" 
# include <stdlib.h> 
void create_dcdt(); 

DCDTWrapper.C++

# define END 12345.6 
# define FIRST_EXAMPLE Example1 
//# include "DCDTsrc/se_dcdt.h" 
//# include "DCDTsrc/gs_polygon.h" 
//# include <stdlib.h> 
# include "DCDTWrapper.h" 

static double Example1[] = 
     { -10, -10, 10, -10, 10, 10, -10, 10, END, 
      1, 1, 7, 3, 3, 8, END, 
     END }; 

static const double* CurExample = FIRST_EXAMPLE; 
static SeDcdt *TheDcdt; 
static GsPolygon CurPath; 
static GsPolygon CurChannel; 
static float CurX1=0, CurY1=0, CurX2=0, CurY2=0; 
static int CurSelection=0; // -2,-1: moving point, >0: moving polygon 


void create_dcdt() 
{ 
    const double* data = CurExample; 
    GsPolygon pol; 

    // domain: 
    while (*data!=END) { pol.push().set((float)data[0],(float)data[1]); data+=2; } 
    TheDcdt->init (pol, 0.00001f); 

    while (*++data!=END) 
    { pol.size(0); 
     while (*data!=END) { pol.push().set((float)data[0],(float)data[1]); data+=2; } 
     TheDcdt->insert_polygon (pol); 
    } 
} 

Makefile:

# Define a variable for classpath 
CLASS_PATH = ../bin 

# Define a virtual path for .class in the bin directory 
vpath %.class $(CLASS_PATH) 

all: libhpaprogram.dylib 

# [email protected] matches the target, $< matches the first dependancy 
libhpaprogram.dylib: 
    cc -v -c -stdlib=libstdc++ -fPIC -I/System/Library/Frameworks/JavaVM.framework/Versions/A/Headers/ HPAProgram.c++ -o libhpaprogram.o 
    libtool -dynamic -lSystem libhpaprogram.o -o libhpaprogram.dylib 

HPAProgram.h : HPAProgram.class 
    javah -classpath $(CLASS_PATH) $* 

clean: 
    rm HPAProgram.h libhpaprogram.o libhpaprogram.dylib 
+1

Было бы очень полезно, если вы включили какой символ не смог найти. –

+0

«Файл x» в библиотеке, с которой вы связываетесь, может быть, что вы компилируете для 64-разрядных и пытаетесь установить связь с 32-разрядной библиотекой. Это случилось со мной не один раз ... –

+0

Что вы подразумеваете под файлом x в библиотеке? Это команда, которую вы можете сделать в файлах .o? Я пытаюсь создать .dylib (почти dll) из файла .o. EDIT Я запустил его в моем файле .o, и он 64 бит. – zaloo

ответ

1

Это ваша проблема:

static void create_dcdt(); 

Когда вы объявляете глобальный объект статический в заголовочном файле, каждый ЕП (т.е. CPP-файл), который включает в себя это хотите создать свою собственную версию этого объекта.

Вы, вероятно, хотите, чтобы претендовать create_dcdt() с ехЬегпом:

extern void create_dcdt(); 

Затем в файле DCDTWrapper.C++ удалить статический классификатор.

Это позволит компилятору разрешить все версии неопределенного объекта быть разрешенными во время соединения, до одной версии, которая живет в одном файле cpp.

(ехЬегп ключевое слово, вероятно, не обязательно, но вы, конечно, не хотите использовать статический здесь)

+0

Я пробовал это, но он по-прежнему дает мне ту же ошибку – zaloo

+0

Вы уверены, что DCDTWrapper.C++ находится в вашем проекте сборки и связан с окончательным выходом? Это единственное объяснение, которое я могу понять, почему он не сможет найти символ сейчас. – Lother

+0

Как проверить, работает ли он в моем проекте сборки? – zaloo

0

Вторая часть вашей проблемы в том, что вы не включая файл DCDTWrapper.C++ в проекте сборки.

Измените Makefile так:

libhpaprogram.dylib: 
    cc -v -c -stdlib=libstdc++ -fPIC -I/System/Library/Frameworks/JavaVM.framework/Versions/A/Headers/ HPAProgram.c++ -o libhpaprogram.o 
    cc -v -c -stdlib=libstdc++ -fPIC -I/System/Library/Frameworks/JavaVM.framework/Versions/A/Headers/ DCDTWrapper.c++ -o DCDTWrapper.o 

    libtool -dynamic -lSystem libhpaprogram.o DCDTWrapper.o -o libhpaprogram.dylib 
+0

все еще сломан, такая же ошибка – zaloo

+0

Можете ли вы вставить выходные данные? Раньше он даже не компилировал DCDTWrapper. – Lother

+1

Я действительно понял это, были некоторые недостающие флаги. Мне пришлось добавить -lc -lstdC++ -ldl – zaloo

0

Я зафиксировал мою проблему, вот обновленный Makefile:

SRC=DCDTsrc 
TGT=obj 
INCLUDES=-IDCDTsrc DCDTWrapper.h SearchAlgorithms.h 
FLAGS=-stdlib=libstdc++ -std=c++0x -D GS_SYSTEM_RAND_LIBS -lm -fPIC -I/System/Library/Frameworks/JavaVM.framework/Versions/A/Headers/ -v 
SOURCES=$(wildcard $(SRC)/*.cpp) DCDTWrapper.cpp SearchAlgorithms.cpp 
OBJS=$(addprefix $(TGT)/, $(notdir $(SOURCES:.cpp=.o))) 
CC=g++ 

# Define a variable for classpath 
CLASS_PATH = ../bin 

# Define a virtual path for .class in the bin directory 
vpath %.class $(CLASS_PATH) 


$(TGT)/%.o: $(SRC)/%.cpp 
    $(CC) $(FLAGS) -c $< -o [email protected] 

$(TGT)/%.o: %.cpp 
    $(CC) $(FLAGS) -c $< -o [email protected] 

# [email protected] matches the target, $< matches the first dependancy 
libsearchalgorithms.dylib: $(OBJS) 
    libtool -lc -lstdc++ -ldl -macosx_version_min 10.9 -lm -dynamic -lSystem $(OBJS) -o libsearchalgorithms.dylib 



SearchAlgorithms.h : SearchAlgorithms.class 
    javah -classpath $(CLASS_PATH) $* 

clean: 
    rm -rf $(TGT) 
    mkdir $(TGT) 
    if [ -a SearchAlgorithms.h ] ; \ 
    then \ 
     rm SearchAlgorithms.h ; \ 
    fi; 
    if [ -a libsearchalgorithms.o ] ; \ 
    then \ 
     rm libsearchalgorithms.o ; \ 
    fi; 
    if [ -a libsearchalgorithms.dylib ] ; \ 
    then \ 
     rm libsearchalgorithms.dylib ; \ 
    fi; 

all:clean SearchAlgorithms.h libsearchalgorithms.dylib 
Смежные вопросы