对于我的网站,我正在尝试制作wkhtmltopdf(Link)。该网站托管在共享主机上,使用未安装的库时有点麻烦。
经过几次尝试使用多个版本的库(其中一些应该是静态的,但我仍然得不到关于共享库的错误)我最后联系了提供商,他告诉我如果我有一个静态版本的库。
问题是,我的linux知识非常有限。 如果我理解正确,静态库将是wkhtmltopdf的一个版本,一个文件,包括所有依赖项?正如官方网站提到的那样:zlib,fontconfig,freetype,X11 libs(libX11,libXext,libXrender)
第二个问题是,你能指出我在哪里可以找到建立这样的图书馆的分步指南吗?因为我的研究到目前为止都没有成功..
答案 0 :(得分:2)
我的linux知识非常有限
我假设你或多或少熟悉windows dll
,它类似于linux .so
s(共享对象)。
共享对象可以在不同程序之间共享(因此名称)。在大多数情况下,加载可执行文件时,库也会加载到内存中。您可以使用ldd
看到此类依赖项。
静态库(或静态链接库,或静态可执行文件,或其他)是在编译时嵌入可执行文件的库。要静态链接您的库,您需要重建可执行文件,并链接到.a
静态库文件,该文件类似于Windows上的.lib
文件(至少使用Visual Studio编译器,IIRC)
这可能很麻烦且耗时。这就是为什么我建议你采取另一种方式:
在Windows上,与可执行文件共享同一文件夹的.dll
文件的优先级高于路径上的文件(IIRC)。在Linux(通常是UNIX)上,这被视为一个安全漏洞,因为有人可能会轻易删除流氓.so
文件并改变程序的行为。但是,您可以使用两个环境变量控制此行为:LD_LIBRARY_PATH
和LD_PRELOAD
。第二个是更强大的,只是某种" dll"注射。但是,第一个控制将搜索.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
变量。它很少开箱即用,但如果你这样做,至少你不应该有任何问题。
回答你的评论:这确实有点像修改Windows上的PATH
(只是为了再次明确这一点:在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或类似内容感兴趣。