Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/api/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java native interface 在linux上编译GraphicsMagick jni库_Java Native Interface_G++_Graphicsmagick - Fatal编程技术网

Java native interface 在linux上编译GraphicsMagick jni库

Java native interface 在linux上编译GraphicsMagick jni库,java-native-interface,g++,graphicsmagick,Java Native Interface,G++,Graphicsmagick,我正在创建一个jni库,它使用GraphicsMagick实现一些功能。我在一个目录中有以下文件 phash.h phash.cc thumbnail.h thumbnail.cc image_jni.h // This is generated by the javah tool image_jni.cc 要编译.so文件,我使用make文件。我首先为每个源生成.o文件,如下所示: HEADERS = image_jni.h phash.h thumbnail.h CPPFLAGS =

我正在创建一个jni库,它使用GraphicsMagick实现一些功能。我在一个目录中有以下文件

phash.h
phash.cc
thumbnail.h
thumbnail.cc
image_jni.h  // This is generated by the javah tool
image_jni.cc
要编译.so文件,我使用make文件。我首先为每个源生成.o文件,如下所示:

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)
这在MacOSX上运行良好,我可以在Java代码中使用共享库。但是,这在使用GCC4.7.3的Linux上不起作用。它在创建.o文件时工作正常,但在创建.o文件时工作正常,因此它会出现以下神秘的错误消息:

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)不匹配

根据手册页:

-pie
    Produce a position independent executable.
当您正在构建共享对象时,您需要删除它,否则它会抱怨“main”。
它可以在Mac OS X上工作,因为如果在构建非可执行文件时使用-pie开关,它会忽略-pie开关。

我必须使用--enable shared创建一个版本的graphics magick,以便正确链接它。
-pie
    Produce a position independent executable.