对于我的网站,我正在尝试使 wkhtmltopdf( Link ) 工作。该网站托管在共享主机上,使用未安装的库时有点麻烦。
在尝试了多个版本的库后(有些应该是静态的,但我仍然收到关于找不到共享库的错误)我最终联系了提供者,他告诉我如果我有一个静态版本的图书馆。
问题是,我的linux知识非常有限。
如果我理解正确,静态库将是 wkhtmltopdf 的一个版本,一个文件,包括所有依赖项?
正如官方网站提到的:zlib,fontconfig,freetype,X11 libs(libX11,libXext,libXrender)
第二个问题是,您能指出我在哪里可以找到构建此类库的分步指南吗?因为我的研究到目前为止没有成功..
最佳答案
my linux knowledge is very limited
我假设您或多或少熟悉 Windows
dll
s,类似于linux .so
s(共享对象)。共享对象可以在不同程序之间共享(因此得名)。在大多数情况下,当加载可执行文件时,库也会加载到内存中。您可以使用
ldd
查看此类依赖项.静态库(或静态链接库、静态可执行文件或其他)是在编译时嵌入在可执行文件中的库。要静态链接您的库,您需要重新构建可执行文件,并使用
.a
链接静态库文件,类似于.lib
Windows 上的文件(至少使用 Visual Studio 编译器,IIRC)。这可能既麻烦又耗时。这就是为什么我建议你采取另一条路线:
在 Windows 上,
.dll
与可执行文件共享同一文件夹的文件的优先级高于路径上的文件 (IIRC)。在 Linux(通常是 UNIX)上,这被认为是一个安全漏洞,因为有人可以轻松删除流氓 .so
文件并更改程序的行为。但是,您可以使用两个环境变量来控制此行为:LD_LIBRARY_PATH
和 LD_PRELOAD
.第二个功能更强大,只是某种“dll”注入(inject)。然而,第一个控制 .so
的路径。文件将被搜索。因此,我建议您使用
ldd
查找所需的依赖项。 ,如果可以的话,在你的服务器上再做一次。寻找每一个丢失的.so
文件。您可以通过发出命令 ldd wkhtmltopdf | grep not found
来做到这一点。 .一旦你有了这个缺失库的列表,将它们捆绑在一起并将它们发送到你的服务器上(注意它们也可能有一些依赖项)。您可能可以在匹配架构的本地 Linux 安装中找到它们,但我鼓励您尝试将发行版与您的提供商匹配。
然后,发出
wkhtmltopdf
设置后调用LD_LIBRARY_PATH
环境变量。你可以这样做:LD_LIBRARY_PATH='/home/me/my_libs':$LD_LIBRARY_PATH /home/me/programs/wkhtmltopdf
请注意,我附加了旧的
LD_LIBRARY_PATH
变量在最后。它很少是开箱即用的,但如果你这样做,至少你应该没有任何问题。回答您的评论:确实有点像修改
PATH
在 Windows 上(再次说明这一点:在 Linux 上,你有相同的 PATH
环境变量,但它只适用于可执行文件的搜索路径;所以我们正在更改另一个 LD_LIBRARY_PATH
环境变量来指定库搜索小路)。请注意,在上面的示例中,我没有在系统范围内更改它,而只是为了调用
wkhtmltopdf
.在 Windows 上,有多种方法可以更改 PATH
环境变量。您可以打开专用的 gui,这将更改路径变量 in the registry .但您也可以在命令提示符或批处理脚本中本地覆盖它。这正是我在这里所做的。一次
LD_LIBRARY_PATH
已导出,它将用于您调用的每个程序,因此如果您有一些不兼容性,在系统范围内设置它可能是危险的。此外,无论您尝试什么,如果您没有 root 访问权限,您将无法在系统范围内设置它。因此,您最多只会影响您的程序。最后一点,你可能会在这个项目中提取很多依赖项,因为它是基于 Qt 的。如果你想静态重建它,你必须先用
-static
构建 Qt .下一次,你可能会对一些容器化技术感兴趣,比如 docker(甚至是 appimages/flatpack/snap),它就是为解决这类问题而设计的。如需进一步阅读 Linux 上的动态链接库,您可能对 this resource 感兴趣。或类似的。
关于linux - 搭建一个linux静态库,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39563199/