0

I am creating a jni library that uses GraphicsMagick for some of it's functionality. I have the following files in a directory

phash.h
phash.cc
thumbnail.h
thumbnail.cc
image_jni.h  // This is generated by the javah tool
image_jni.cc

To compile a .so file I am using a make file. I first generate the .o files for each of the sources like this:

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 $@ $(CPPFLAGS) $(CXXFLAGS) -c $< 

$(LIBPATH): phash.o thumbnail.o image_jni.o
    $(CXX) -o $@ -shared $^ $(LDFLAGS)

The platform specific flags for linux are set as follows:

PLATFORM_CPPFLAGS = -I$(JAVA_HOME)/include -I$(JAVA_HOME)/include/linux
LIB_EXT = so

これは Mac OS X で問題なく動作し、Java コードで共有ライブラリを使用できます。ただし、Gcc 4.7.3 を使用する Linux では機能しません。.o ファイルを作成するときは問題なく動作しますが、.so を作成するときに、次の不可解なエラー メッセージが表示されます。

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 ファイルからの翻訳は正当なもののようです。私の推測では、g++ は共有ライブラリを作成する必要があることを認識していません。GraphicsMagick++-config --ldflags --libs と私自身のリンカー オプションとの間の奇妙な相互作用である可能性もあります。Graphics 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) とうまくいかないのでしょうか?

4

1 に答える 1

0

マニュアルページによると:

-pie
    Produce a position independent executable.

共有オブジェクトを構築しているので、それを削除する必要があります。そうしないと、「メイン」に対して文句を言います。非実行可能ファイルのビルド中に使用された場合、-pie スイッチを単純に無視するため、Mac OS X で動作します。

于 2013-07-30T12:26:29.970 に答える