0
我正在創建一個jni庫,它使用GraphicsMagick來實現它的某些功能。我有以下目錄中的文件在Linux上編譯GraphicsMagick jni庫
phash.h
phash.cc
thumbnail.h
thumbnail.cc
image_jni.h // This is generated by the javah tool
image_jni.cc
要編譯.so文件我使用的是make文件。我第一次產生.o文件,爲每個來源是這樣的:對Linux
HEADERS = image_jni.h phash.h thumbnail.h
CPPFLAGS = $(PLATFORM_CPPFLAGS) -I/opt/X11/include `GraphicsMagick++-config --cppflags`
CXXFLAGS = $(PLATFORM_CXXFLAGS) -fPIC -std=gnu++11 -Os `GraphicsMagick++-config --cxxflags`
LDFLAGS = $(PLATFORM_LDFLAGS) -fPIC -lc -std=gnu++11 -L/opt/X11/lib -lX11 `GraphicsMagick++-config --ldflags --libs`
PROJECT_ROOT = ../../..
LIBPATH = $(PROJECT_ROOT)/lib/libMyfoo.$(LIB_EXT)
%.o: %.cc $(HEADERS)
$(CXX) -o [email protected] $(CPPFLAGS) $(CXXFLAGS) -c $<
$(LIBPATH): phash.o thumbnail.o image_jni.o
$(CXX) -o [email protected] -shared $^ $(LDFLAGS)
平臺特定的標誌設置如下:
PLATFORM_CPPFLAGS = -I$(JAVA_HOME)/include -I$(JAVA_HOME)/include/linux
LIB_EXT = so
能正常工作在Mac OS X和我可以在我的Java代碼中使用共享庫。然而,這在使用Gcc 4.7.3的Linux上不起作用。
g++ -o ../../../lib/libMyfoo.so -shared phash.o thumbnail.o image_jni.o -fPIC -lc -std=gnu++11 -L/opt/X11/lib -lX11 `GraphicsMagick++-config --ldflags --libs`
/usr/lib/gcc/x86_64-linux-gnu/4.7/../../../x86_64-linux-gnu/Scrt1.o: In function `_start':
(.text+0x20): undefined reference to `main'
collect2: error: ld returned 1 exit status
make: *** [../../../lib/libMyfoo.so] Error 1
從make文件翻譯似乎是合法的:創建.o文件,但創造它具有以下含義模糊的錯誤消息,抱怨的。所以,當,當它工作正常。我的猜測是,g ++並不知道它需要創建一個共享庫。它也可能是GraphicsMagick ++ - config --ldflags --libs和我自己的鏈接器選項之間的奇怪交互。圖形Magick命令將擴展爲:
-L/usr/lib -fPIE -pie -Wl,-z,relro -Wl,-z,now -L/usr/lib/X11 -L/usr/lib -L/usr/lib
-lGraphicsMagick++ -lGraphicsMagick -llcms -ltiff -lfreetype -ljasper -ljpeg -lpng -lwmflite -lXext -lSM -lICE -lX11 -lbz2 -lxml2 -lz -lm -lgomp -lpthread -lltdl
也許-fPIE -pie選項不與我的選擇(FPIC),其餘順利?
我不得不建立一個版本的圖形magick與 - 啓用共享,以正確鏈接。 – Rajiv