2016-09-18 81 views
1

对于我的一个网站,我试图让wkhtmltopdf(Link)的工作。该网站托管在共享主机上,使用未安装的库时有点麻烦。构建一个linux静态库

经过几次试图与多个版本的库(一些应该是静态的,但我仍然有关于共享库的错误没有找到)我最终联系提供商,谁告诉我,如果我有库的静态版本。

问题是,我的linux知识非常有限。 如果我理解正确,静态库应该是wkhtmltopdf的一个版本,一个单独的文件,包括所有的依赖关系?

随着官方网站提到的优势如下:zlib的,fontconfig的是,FreeType,X11库(的libx11,libXext,libXrender)

第二个问题是,你能指出我在那里我能找到一个循序渐进的指南建立这样的图书馆?作为我的研究是不成功的,到目前为止..

回答

2

我的Linux知识是非常有限的

我会假设你正在使用Windows dll s,这是类似于到Linux .so S比或不太熟悉的(共享对象)。

共享对象可以在不同的程序之间共享(因此是名称)。在大多数情况下,加载可执行文件时,库也会加载到内存中。您可以使用ldd查看这种依赖关系。

静态库(或静态链接库,或静态可执行文件,或其他)是在编译时嵌入在可执行文件中的库。为了静态链接你的库,你需要重建你的可执行文件,并链接一个.a静态库文件,这与Windows上的.lib文件类似(使用Visual Studio编译器,至少是IIRC)。


这可能很麻烦并且很费时间。这就是为什么我建议你采取另一条路线:

在Windows上,.dll与可执行文件共享相同文件夹的文件被赋予比路径(IIRC)更高的优先级。在Linux(通常是UNIX)上,这被认为是一个安全漏洞,因为有人可能很容易丢弃一个流氓.so文件并改变程序的行为。但是,您可以使用两个环境变量来控制此行为:LD_LIBRARY_PATHLD_PRELOAD。第二个是更强大一点,只是某种“dll”注入。然而,第一个控件将搜索.so文件的路径。

因此,我建议您使用ldd查找所需的依赖关系,如果可以,请在服务器上再次执行此操作。寻找每个缺失的.so文件。您可以通过发出命令ldd wkhtmltopdf | grep not found来完成。

一旦你有这个缺失库的列表,将它们捆绑在一起并发送到你的服务器上(注意它们也可以有一些依赖关系)。您可能可以在本地Linux上匹配的体系结构上找到它们,但我鼓励您尝试将该分发与您的提供程序匹配。

然后,在设置LD_LIBRARY_PATH环境变量后发出wkhtmltopdf调用。你能做到像这样:

LD_LIBRARY_PATH='/home/me/my_libs':$LD_LIBRARY_PATH /home/me/programs/wkhtmltopdf 

注意,我附上老LD_LIBRARY_PATH变量在最后。它几乎没有开箱,但至少你不应该有任何问题,如果你这样做。这再次明确这的确是一个有点像修改Windows上的PATH(只是为了:


为了回答您的评论在Linux上,你有同样的PATH环境变量,但它仅适用于可执行文件搜索路径;因此我们正在更改另一个LD_LIBRARY_PATH环境变量以指定库搜索路径)。

请注意,在上面的例子中,我没有改变它在系统范围内,但只为调用wkhtmltopdf。在Windows上,有多种方法可以更改环境变量PATH。您可以打开专用gui,它将更改路径变量in the registry。但是,您也可以在命令提示符或批处理脚本中在本地覆盖它。这正是我在这里所做的。

一旦导出了LD_LIBRARY_PATH,它将用于您调用的每个程序,因此如果您有一些不兼容的情况,将其设置为系统范围可能会很危险。此外,无论您尝试什么,如果您没有root访问权限,您将无法在系统范围内设置它。所以,你最多只会影响你的程序。

作为最后一点,您可能会对该项目产生很多依赖关系,因为它是基于Qt的。如果你想静态重建它,你必须先用-static构建Qt。下一次,您可能会对一些容器化技术感兴趣,比如码头工(甚至是appimages/flatpack/snap),该工具旨在解决这类问题。

想要进一步阅读Linux上的动态链接库,您可能对this resource或其他类似软件感兴趣。

+0

非常感谢您的回复!第一部分很清晰! 我有一个问题:最后一位将wkhtmltopdf libs文件夹添加到整个服务器的搜索路径(如修改窗口上的PATH)?或只为wkhtmltopdf库? – Hyti

+0

我编辑了我的答案以回答您的评论 – MayeulC

+0

感谢所有的信息,我会开始并尝试使其工作! – Hyti