如何在 automake 中动态 link 库?

How to dynamically link libraries in automake?

我正在尝试在 lauchpad 上构建一个包。为了构建它,我需要在 automake 中使用 LDADD 变量设置静态路径:

relay_LDADD = /usr/lib/x86_64-linux-gnu/libm.so /usr/lib/x86_64-linux-gnu/libX11.so.6 $(RELAY_LIBS)

这在 64 位版本上编译但在 32 位版本上失败。我尝试使用 PKG_CHECK_MODULES 但它显示

No package 'm' found
No package 'X11' found

Consider adjusting the PKG_CONFIG_PATH environment variable if you
installed software in a non-standard prefix.

我知道这不是非标准路径,因为 launchpad 正在构建?我怎样才能让它工作?

即使包在 build-requires 中指定了库,但没有指定库,构建失败。

你试图智取 buid 系统,它智取了你。

硬编码路径通常不是一个好主意。

Debian(ubuntu 只是一个衍生产品),已经开始在依赖架构的目录中发布二进制文件(如库),以允许在单个系统上安装多个架构。

这些库安装到 /usr/lib/<host-triplet>,其中 <host-triplet> 取决于体系结构;例如x86_64-linux-gnuamd64 体系结构,用于具有 linuxgnu[=59= 的系统] 工具。 32 位系统通常具有 i386-linux-gnu.

的主机三元组

由于您将库路径硬编码到 64 位位置 (/usr/lib/x86_64-linux-gnu/libm.so),这在所有系统上都会失败,但 64 位/linux/gnu.

相反,您应该告诉 linker link 反对 m 库 (libm),resp X11 库 (libX11)。 让 linker 关心选择正确的架构:

relay_LDADD = -lm -lX11 $(RELAY_LIBS)

一般来说,如果您想 link 针对提供库文件 libfoo.so 的库 foo,您可以使用 -lfoo(去掉前导 lib 和尾随 .so)。

然而,有时这还不够;在这些情况下,您的图书馆可能会使用 pkg-config 来提供针对该图书馆 compile/link 所需的完整 CFLAGSLDFLAGS

例如如果我想使用 libquicktime:

 $ pkg-config --cflags libquicktime
 -I/usr/include/lqt
 $ pkg-config --libs libquicktime
 -lquicktime -lpthread -lm -lz -ldl

所以我会使用类似的东西:

  myprog_CFLAGS += $(shell pkg-config --cflags libquicktime)
  myprog_LDADD += $(shell pkg-config --libs libquicktime)

这适用于任何 GNU(?) Makefile(与 autotools 无关)。 在 autotools 项目中,您可能会将 pkg-config 检查移动到 configure,使用 m4-macro PKG_CHECK_MODULES