我正在尝试在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中指定了它们,构建也会在没有指定库的情况下失败。
答案 0 :(得分:2)
你曾尝试过智胜系统,它已经让你失败了。
硬编码路径通常是一个坏主意。
Debian(和ubuntu只是一个衍生产品),已开始在依赖于体系结构的目录中发布二进制文件(如库),以允许在单个系统上安装多个体系结构。
这些库安装在/usr/lib/<host-triplet>
中,其中<host-triplet>
取决于架构;例如x86_64-linux-gnu
是具有 linux 和 gnu 工具的系统的 amd64 架构。
32位系统通常具有i386-linux-gnu
的主机 - 三元组。
由于您将库路径硬编码到64位(/usr/lib/x86_64-linux-gnu/libm.so
),因此在所有系统上都会失败,但 64bit / linux / gnu 。
相反,您应该告诉链接器链接 m 库(libm
),然后转发 X11 库(libX11
)。
让链接器关注正确的架构来选择:
relay_LDADD = -lm -lX11 $(RELAY_LIBS)
一般情况下,如果您要链接库 foo ,它提供了一个库文件libfoo.so
,您将使用-lfoo
(剥离前导{{1}跟踪lib
)。
然而,有时这还不够;在这些情况下,您的库可能会使用.so
来提供编译/链接此库所需的完整pkg-config
和CFLAGS
。
e.g。如果我想使用LDFLAGS
:
libquicktime
所以我会使用类似的东西:
$ pkg-config --cflags libquicktime
-I/usr/include/lqt
$ pkg-config --libs libquicktime
-lquicktime -lpthread -lm -lz -ldl
这适用于任何GNU(?)Makefile(与autotools无关)。
在autotools项目中,您可能会使用m4-macro myprog_CFLAGS += $(shell pkg-config --cflags libquicktime)
myprog_LDADD += $(shell pkg-config --libs libquicktime)
configure