构建一个 linux 静态库
Build a linux static library
对于我的网站,我正在尝试使 wkhtmltopdf(Link) 正常工作。该网站托管在共享主机上,使用未安装的库时有点麻烦。
尝试使用多个版本的库(有些应该是静态的,但我仍然收到有关未找到共享库的错误消息)后,我最终联系了提供商,他告诉我如果我这样做就可以了有一个静态版本的库。
问题是,我的linux知识非常有限。
如果我理解正确,静态库将是 wkhtmltopdf 的一个版本,一个文件,包括所有依赖项?
正如官方网站提到的:zlib、fontconfig、freetype、X11 库(libX11、libXext、libXrender)
第二个问题是,你能告诉我在哪里可以找到构建此类库的分步指南吗?因为我的研究到目前为止没有成功..
my linux knowledge is very limited
我假设您或多或少熟悉 windows dll
s,它们类似于 linux .so
s(共享对象)。
共享对象可以在不同程序之间共享(因此得名)。在大多数情况下,当加载可执行文件时,库也会加载到内存中。您可以使用 ldd
.
查看此类依赖项
静态库(或静态 linked 库,或静态可执行文件,或其他)是在编译时嵌入到可执行文件中的库。要静态 link 你的库,你需要重建你的可执行文件,并且 link 使用 .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 安装中找到它们,但我鼓励您尝试将发行版与您的提供商之一相匹配。
然后,在设置 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 访问权限,您将无法将其设置为 system-wide。所以,你最多只会影响你的程序。
最后一点,您可能会从该项目中提取很多依赖项,因为它是基于 Qt 的。如果你想静态重建它,你必须先用 -static
构建 Qt。下一次,你可能会对一些容器化技术感兴趣,比如docker(甚至appimages/flatpack/snap),它就是为了解决这类问题而设计的。
要进一步阅读 Linux 上的动态 link 库,您可能对 this resource 或类似内容感兴趣。
对于我的网站,我正在尝试使 wkhtmltopdf(Link) 正常工作。该网站托管在共享主机上,使用未安装的库时有点麻烦。
尝试使用多个版本的库(有些应该是静态的,但我仍然收到有关未找到共享库的错误消息)后,我最终联系了提供商,他告诉我如果我这样做就可以了有一个静态版本的库。
问题是,我的linux知识非常有限。 如果我理解正确,静态库将是 wkhtmltopdf 的一个版本,一个文件,包括所有依赖项?
正如官方网站提到的:zlib、fontconfig、freetype、X11 库(libX11、libXext、libXrender)
第二个问题是,你能告诉我在哪里可以找到构建此类库的分步指南吗?因为我的研究到目前为止没有成功..
my linux knowledge is very limited
我假设您或多或少熟悉 windows dll
s,它们类似于 linux .so
s(共享对象)。
共享对象可以在不同程序之间共享(因此得名)。在大多数情况下,当加载可执行文件时,库也会加载到内存中。您可以使用 ldd
.
静态库(或静态 linked 库,或静态可执行文件,或其他)是在编译时嵌入到可执行文件中的库。要静态 link 你的库,你需要重建你的可执行文件,并且 link 使用 .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 安装中找到它们,但我鼓励您尝试将发行版与您的提供商之一相匹配。
然后,在设置 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 访问权限,您将无法将其设置为 system-wide。所以,你最多只会影响你的程序。
最后一点,您可能会从该项目中提取很多依赖项,因为它是基于 Qt 的。如果你想静态重建它,你必须先用 -static
构建 Qt。下一次,你可能会对一些容器化技术感兴趣,比如docker(甚至appimages/flatpack/snap),它就是为了解决这类问题而设计的。
要进一步阅读 Linux 上的动态 link 库,您可能对 this resource 或类似内容感兴趣。