3

我正在尝试在 linux(debian 64 位)中使用 pdfium 库。我设法(最终)编译了 pdfium 的 _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 符号。这似乎没有意义...

我不知道我是否指的是包含或库中的错误路径,或者是否是其他错误。

我试图理解 chromiums pdf 插件项目 makefile,因为我认为这可能有助于我理解我应该使用什么,但不幸的是它没有帮助。

关于我做错了什么的任何想法?

4

3 回答 3

1

args 文件..

# 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

链接没问题。

于 2018-11-22T19:01:45.657 回答
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

public/ 是您在使用 PDFium 作为标题时应该使用的唯一目录。在-framework AppKitOSX 上是必需的。PDFium 标头是纯 C 语言,但您需要-lstdc++,因为 PDFium 在内部使用 C++,并且它需要能够在新/删除中链接。

如果您使用 V8,则需要添加:

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

如果您使用的是 XFA,您将需要 V8 包括:

-lfpdfxfa -lxfa  -lfx_tiff

编辑最近pdf_is_complete_lib在 PDFium 版本中添加了一个选项。将其设置为truegn args将创建一个可以再次链接的 libpdfium。请注意,这仅在禁用 V8 和 XFA 的情况下进行了测试。

于 2016-03-29T23:59:43.253 回答
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"]
于 2020-02-16T23:49:18.480 回答