2013-07-30 39 views
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),其餘順利?

回答

0

按照手冊頁:

-pie 
    Produce a position independent executable. 

當你正在構建共享對象,您需要刪除,否則會抱怨爲「主」。 它適用於Mac OS X,因爲如果在構建非可執行文件時使用它,它會忽略-pie開關。

+0

我不得不建立一個版本的圖形magick與 - 啓用共享,以正確鏈接。 – Rajiv