在Linux上链接PDFium

3

我正在尝试在Linux(Debian 64位)中使用pdfium库。最终,我成功编译出了PDFium的release _x64版本,并且测试程序似乎也能正常工作。然而,我无法将这些库用于另一个项目。

以下是我的文件:

#include <iostream>
#include "fpdfview.h" 
#include "fpdftext.h" 
#include "fpdfdoc.h" 
#include "fpdfedit.h"
main(){
 FPDF_InitLibrary();
 std::cout << "Hello World!"<<std::endl;
 return 0;
}

这是我的Makefile文件:

CC = g++
CFLAGS = -Wall  -g -Wno-unused-variable -Wno-reorder -I/usr/include/pdfium/core/include  -I/usr/include/pdfium/fpdfsdk/include  -I/usr/include/pdfium/third_party  -I/usr/include/pdfium/v8/include
LIBS_pdfium =  -static -L/usr/lib/pdfium
LDFLAGS = $(LIBS_pdfium)

Main : Main.o 
    ${CC} ${CFLAGS} Main.o ${LDFLAGS}  -o Main

Main.o : Main.cpp  
    ${CC} ${CFLAGS} -c -std=c++11 Main.cpp

clean:
    rm *o Main

当我运行makefile时,结果是:
g++ -Wall  -g -Wno-unused-variable -Wno-reorder -I/usr/include/pdfium/core/include  -I/usr/include/pdfium/fpdfsdk/include  -I/usr/include/pdfium/third_party  -I/usr/include/pdfium/v8/include     Main.o -static -L/usr/lib/pdfium  -o Main
Main.cpp:11: error: undefined reference to 'FPDF_InitLibrary'
collect2: error: ld returned 1 exit status

我也尝试使用/home/username/pdfium/out/Release_x64/obj中的库,但是遇到了相同的错误。
我知道这个错误:undefined reference to FPDF_InitLibrary意味着存在链接错误。因此,我使用objdump检查了/home/username/pdfium/out/Release_x64/obj中的库,其中一个包含InitLibrary符号。这似乎没有任何意义...
我不知道我是否在include或libraries中引用了错误的路径,还是其他地方出了问题。
我尝试理解chromiums pdf插件项目的makefile,因为我认为这可能有助于我理解应该使用什么,但不幸的是它没有帮助我。
对于我做错了什么,有什么想法吗?

检查测试程序是否将fpdf包含在extern "C" {}块中(或者测试程序是.c而不是.cpp,则不需要此块)。如果是这样,您必须在fpdf包含周围添加extern "C" {}。这是我首先想到的事情。 - Rudolfs Bundulis
谢谢@RudolfsBundulis,我看了其中一个测试,它们没有使用extern "c"且是一个cpp文件。在包含文件中有extern "C"。这是否相关? - user3872358
如果 extern "C" 包装的是你正在使用的相同包含文件,那么它就是相关的(准确地说 - 如果它用于声明 FPDF_InitLibrary 的包含文件周围,则它是相关的)。但是为了不浪费时间进行测试 - 只需尝试将 extern "C" {} 添加到您的应用程序中 - 很可能这就是您需要解决此问题的方法。 - Rudolfs Bundulis
1
啊,抱歉,我的错,我实际上没有足够的注意力 - 在 makefile 中,您没有指定要链接的库。LIBS_pdfium 不应该包含要链接的库的名称吗?您只是使用 -L 指定了路径,但没有实际的库。 - Rudolfs Bundulis
2
你能否在下面添加一个答案,列出未来搜索者所需的链接标志? - dj2
显示剩余12条评论
3个回答

1

参数 文件..

# Build arguments go here.
# See "gn args <out_dir> --list" for available build arguments.
is_debug = false
pdf_is_standalone = true
pdf_use_skia = false
pdf_use_skia_paths = false
pdf_enable_xfa = false
pdf_enable_v8 = false
is_component_build = false
clang_use_chrome_plugins = false 
pdf_is_complete_lib = true
use_custom_libcxx = false

然后运行 gn gen your/dir/catalog

接着运行 ninja -C your/dir/catalog pdfium_all,你会得到 pdfium.a

在链接器中:

...
g++ -L-I/usr/include/glib-2.0 -o bin/debug/pdfium_test obj/debug/main.o   
...

您必须使用以下命令进行链接:-pg -s -Wl,--start-group /home/a/repo/pdfium/out/release/obj/libpdfium.a -Wl,--end-group -lpthread -ldl -lpthread

链接成功。


1
要使用PDFium编译,链接行将取决于您是否已将V8和/或XFA编译到您的PDFium二进制文件中。
如果没有启用这些功能,则需要类似以下内容的内容:
PDF_LIBS="-lpdfium -lfpdfapi -lfxge -lfpdfdoc -lfxcrt -lfx_agg \
 -lfxcodec -lfx_lpng -lfx_libopenjpeg -lfx_lcms2 -lfx_freetype -ljpeg \
 -lfx_zlib -lfdrm -lpdfwindow -lbigint -lformfiller -ljavascript \
 -lfxedit"
PDF_DIR=<path/to/pdfium>

clang -I $PDF_DIR/public -o foo foo.c -L $PDF_DIR/out/Debug -lstdc++ -framework AppKit $PDF_LIBS

在使用PDFium头文件时,应只使用public/目录。在OSX上需要-framework AppKit。PDFium的头文件是纯C编写的,但由于PDFium内部使用C++,因此需要-lstdc++以便能够链接new/delete。

如果您正在使用V8,则需要添加以下内容:

-lv8_libbase -lv8_libplatform -lv8_snapshot -licui18n -licuuc -licudata

如果您正在使用XFA,您将需要V8包含文件加上:

-lfpdfxfa -lxfa  -lfx_tiff

编辑 最近在PDFium构建中添加了pdf_is_complete_lib选项。在您的gn args中将其设置为true将创建一个可以链接的单个libpdfium。注意,这仅已经测试过V8和XFA被禁用。


0

我个人没有构建它 - 因为它太耗时间了。但是我成功地使用cgo在我的golang应用程序中使其工作。我在docker中使用ubuntu 16.04作为基本映像。这取决于https://github.com/bblanchon/pdfium-binaries

以下dockerfile下载pdfium二进制文件,并使用pkg-config链接到您正在开发的应用程序。

FROM ubuntu:16.04
# Specify pdfium version
ARG PdfiumVersion=4026

# Install pkg-config, etc.
RUN apt-get -yqq update && apt-get clean && apt-get install -yqq apt-utils pkg-config tzdata && dpkg-reconfigure -f noninteractive tzdata

# Create .pc file for pkg-config
RUN echo "\n" \
     "prefix=/home\n" \
     "Name: pdfium\n" \
     "Description: pdfium\n" \
     "Version: $PdfiumVersion\n" \
     "Requires:\n" \
     "Libs: -L/home/lib -lpdfium\n" \
     "Cflags: -I/home/include\n" >  /home/pdfium.pc

# Download and extract pdfium binary
RUN cd /home && wget --quiet https://github.com/bblanchon/pdfium-binaries/releases/download/chromium%2F$PdfiumVersion/pdfium-linux.tgz \
&& tar -xf pdfium-linux.tgz && rm pdfium-linux.tgz

# Setting up paths for pkg-config
ENV LD_LIBRARY_PATH=/home/lib
ENV PKG_CONFIG_PATH=/home/

## COPY YOUR APP TO /app/src/yourApp
# BUILD YOUR APP
WORKDIR /app/src/yourApp

# RUN your app which is linked to pdfium
ENTRYPOINT [“./yourApp"]

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接