Linux 如何在automake中动态链接库?

Linux 如何在automake中动态链接库?,linux,compiler-errors,automake,building,launchpad,Linux,Compiler Errors,Automake,Building,Launchpad,我正试图在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_模块,但它说 No package 'm' found No package 'X11' found Cons

我正试图在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_模块,但它说

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正在建造?我怎样才能让它工作


在没有指定库的情况下,生成失败,即使包在生成要求中指定了库。

您已尝试智胜buid系统,但它智胜了您

对路径进行硬编码通常是个坏主意

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

这些库安装在
/usr/lib/
中,其中
取决于体系结构;e、 g.
x86_64-linux-gnu
是适用于使用linux和gnu工具的系统的amd64体系结构。 32位系统通常有一个主机三元组
i386 linux gnu

由于您正在将库路径硬编码到64位位置(
/usr/lib/x86_64-linux-gnu/libm.so
),因此除了64位/linux/gnu之外,其他所有系统都会失败

相反,您应该只告诉链接器链接到m库(
libm
),而不是X11库(
libX11
)。 让链接器关注要选择的正确体系结构:

relay_LDADD = -lm -lX11 $(RELAY_LIBS)
通常,如果您想链接库foo,它提供了一个库文件
libfoo.so
,您可以使用
-lfoo
(去掉前面的
lib
和后面的
.so

然而,有时这是不够的;在这些情况下,您的库可能会使用
pkg config
提供编译/链接此库所需的完整
CFLAGS
LDFLAGS

e、 g.如果我想使用
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项目中,您可能会使用m4宏
pkg\u check\u模块将pkg config check移动到
configure
,您试图智胜内置系统,但它智胜了您

对路径进行硬编码通常是个坏主意

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

这些库安装在
/usr/lib/
中,其中
取决于体系结构;e、 g.
x86_64-linux-gnu
是适用于使用linux和gnu工具的系统的amd64体系结构。 32位系统通常有一个主机三元组
i386 linux gnu

由于您正在将库路径硬编码到64位位置(
/usr/lib/x86_64-linux-gnu/libm.so
),因此除了64位/linux/gnu之外,其他所有系统都会失败

相反,您应该只告诉链接器链接到m库(
libm
),而不是X11库(
libX11
)。 让链接器关注要选择的正确体系结构:

relay_LDADD = -lm -lX11 $(RELAY_LIBS)
通常,如果您想链接库foo,它提供了一个库文件
libfoo.so
,您可以使用
-lfoo
(去掉前面的
lib
和后面的
.so

然而,有时这是不够的;在这些情况下,您的库可能会使用
pkg config
提供编译/链接此库所需的完整
CFLAGS
LDFLAGS

e、 g.如果我想使用
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项目中,您可能会使用m4宏
pkg\u check\u模块将pkg config检查移动到
configure
,这太棒了!查找库的链接器标志的命令是什么?太好了!查找库的链接器标志的命令是什么?