linux - 搭建一个linux静态库

标签 linux static-libraries wkhtmltopdf

对于我的网站,我正在尝试使 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_PATHLD_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/

相关文章:

linux - 我如何在 Linux 内核中使用 pwm-beeper 模块?

c - mremap "initialize"内存是否增长?

ios - 如何在不暴露源代码的情况下分发 Swift 库?

css - wkhtmltopdf 文本分为 2 页

linux - 编译 libsndfile,没有找到 FLAC

c++ - 初始化嵌入在静态库中的 qt 资源

c++ - 即使选择了指向 ATL 的静态链接,Atl71.dll 依赖性仍然存在

wkhtmltopdf - wkhtml2pdf 可以支持 CSS 计数器吗?

python - django-wkhtmltopdf 给出 "[Error 2] The system cannot find the file specified"?

linux - 查找字符串并将替换的字符串存储在其他文件 shell 脚本中