【问题标题】:Compiling GraphicsMagick jni library on linux在 Linux 上编译 GraphicsMagick jni 库
【发布时间】:2013-07-30 08:03:18
【问题描述】:

我正在创建一个 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)

linux的平台特定标志设置如下:

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)?

【问题讨论】:

    标签: java-native-interface g++ graphicsmagick


    【解决方案1】:

    根据手册页:

    -pie
        Produce a position independent executable.
    

    由于您正在构建共享对象,您需要将其删除,否则它会抱怨“main”。 它适用于 Mac OS X,因为如果在构建非可执行文件时使用 -pie 开关,它会简单地忽略。

    【讨论】:

    • 我必须构建一个带有 --enable shared 的图形魔法版本才能正确链接。
    猜你喜欢
    • 2011-04-26
    • 2013-02-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-05-04
    • 2016-12-30
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多