0

我正在尝试在 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.

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

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

4

1 回答 1

4

您试图智取 buid 系统,它也智取了您。

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

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

这些库安装在/usr/lib/<host-triplet>中,<host-triplet>具体取决于架构;例如,带有linuxgnu工具的系统x86_64-linux-gnuamd64架构。32 位系统通常会有一个.i386-linux-gnu

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

相反,您应该只告诉链接器链接到m库(libm),resp X11库(libX11)。让链接器负责选择正确的架构:

relay_LDADD = -lm -lX11 $(RELAY_LIBS)

一般来说,如果你想链接一个库foo,它提供了一个libfoo.so你可以使用的库文件-lfoo(去掉前导lib和尾随.so)。

然而,有时这还不够;在这些情况下,您的库可能会pkg-config用来提供针对该库进行编译/链接所需CFLAGS的全部内容。LDFLAGS

例如,如果我想使用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 项目中,您可能会configure使用 m4-macro将 pkg-config 检查移至PKG_CHECK_MODULES

于 2015-07-06T11:28:01.120 回答