【问题标题】:Adding AM_LDFLAGS has no effect in final library, causing linker errors添加 AM_LDFLAGS 对最终库没有影响,导致链接器错误
【发布时间】:2013-05-23 14:53:26
【问题描述】:

我在我的项目中使用 GNU autohell,它是一个 C++ 库。它应该链接到 ZMQ 并提升。所以我在configure.ac中添加了对所需库的检查

PKG_CHECK_MODULES(ZMQ, libzmq >= 3.2.3)

Makefile.am中的链接器标志:

AM_LDFLAGS = -lzmq

一切都可以编译和链接,但是当我尝试在实际应用程序中使用库时出现未定义的引用错误。我想知道它是否真的与必要的库相关联。令人惊讶的是,ldd 的结果是这样的:

ldd ./libait-0.1.0.so
    linux-vdso.so.1 =>  (0x00007fff85dfd000)
    libstdc++.so.6 => /usr/lib/x86_64-linux-gnu/libstdc++.so.6 (0x00007fea7efa4000)
    libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007fea7ebe5000)
    libgcc_s.so.1 => /lib/x86_64-linux-gnu/libgcc_s.so.1 (0x00007fea7e9ce000)
    libm.so.6 => /lib/x86_64-linux-gnu/libm.so.6 (0x00007fea7e6d2000)
    /lib64/ld-linux-x86-64.so.2 (0x00007fea7f4d9000)

没有像这样添加到 ZMQ 或其他库的链接。我做错了什么?

更新

Makefile.am的内容

AUTOMAKE_OPTIONS = subdir-objects
ACLOCAL_AMFLAGS = ${ACLOCAL_FLAGS} -I m4
#AM_LDFLAGS = -lzmq
libait_la_LIBADD = $(ZMQ_LIBS)
lib_LTLIBRARIES = libait-@AIT_API_VERSION@.la
AM_CPPFLAGS = -pipe
libait_@AIT_API_VERSION@_la_SOURCES = ....
libait_@AIT_API_VERSION@_la_LDFLAGS = -version-info $(AIT_SO_VERSION)
ait_includedir = $(includedir)/ait
ait_include_HEADERS =  ....
ait_libincludedir = $(libdir)/ait-$(AIT_API_VERSION)/include
pkgconfigdir = $(libdir)/pkgconfig
pkgconfig_DATA = ait-$(AIT_API_VERSION).pc
dist_noinst_SCRIPTS = autogen.sh

【问题讨论】:

  • 那么具体是怎么回事?到目前为止,ldd 的输出看起来还不错。
  • @ldav1s 不应该有指向libzmq 和 boost 的链接吗?
  • 如果它们被使用,应该有指向这些库的链接。使用 Boost,可能有也可能没有库,这取决于您在 Boost 中使用的内容。除了 libstdc++ 之外,很多 Boost 不依赖于外部库。
  • @ldav1s 使用来自 boost 的序列化和文件系统,并使用了 ZMQ。虽然我在最终的二进制工件中看不到任何联系的迹象。在编译/链接阶段也没有-lzmq-lboost_filesystem

标签: c++ linux autotools autoconf automake


【解决方案1】:

PKG_CHECK_MODULES(ZMQ, libzmq >= 3.2.3) 设置变量:ZMQ_CFLAGSZMQ_LIBS

configure.ac 中使用AC_SUBST(ZMQ_LIBS) 作为Makefile.am 替换变量:
libait_la_LIBADD = $(ZMQ_LIBS)

这种方法让libtool 处理库依赖关系,并在libait.la 文件中维护依赖关系信息。

【讨论】:

  • 它说“变量libait_la_LIBADD' is defined but no program or library has libait_la'作为规范名称(可能是错字)”我编辑了我的问题并填写了完整的Makefile.am
  • 那是因为你的库名为libait-0.1.0;这可能不是正确的做法……但如果你坚持,只要像下面的 _SOURCES_LDFLAGS 三行那样做。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2022-01-17
  • 2021-01-01
  • 1970-01-01
  • 2012-04-05
  • 1970-01-01
  • 2014-11-11
  • 1970-01-01
相关资源
最近更新 更多