1

我在autotool环境中。

我正在开发一个A使用库BC作为依赖项的库。

  • Blibtool所以输出是libB.la
  • C用简单的 Makefile 构建,输出是libC.a
  • 我也用 libtool 构建A,输出是libA.la

然后我构建了一个将这些库链接在一起的测试程序。

下面Makefile.am是。

check_PROGRAMS = acc_test

AM_CPPFLAGS = -I$(top_srcdir)/include \
              -I$(top_srcdir)/deps/C/include \
              -I$(top_srcdir)/deps/B/include


LDADD = $(top_builddir)/src/libA.la \
        $(top_builddir)/deps/B/src/libB.la \
        $(top_builddir)/deps/C/libC.a

acc_test_SOURCES = test.cpp

当我跑步时acc_test,我遇到

dyld:惰性符号绑定失败:找不到符号:__ZN7leveldb7OptionsC1Ev 引用自:/Users/somepath/build/src/.libs/libA.0.dylib 预期在:平面命名空间

dyld:找不到符号:__ZN7leveldb7OptionsC1Ev 引用自:/Users/somepath/cw/build/src/.libs/libA.0.dylib 预期在:平面命名空间

这是我的主要问题。

在我尝试了很多事情之后,我发现了这一点。

  • C调用内部库的某些功能时崩溃A。如果我将它们从代码中注释掉A,它不会崩溃。
  • C情况 1:如果我在 中显式地编写代码test.cpp,它不会崩溃。
  • 案例2:如果我添加AM_LDFLAGS = -static,它不会崩溃。
  • 案例3:我尝试用 模拟相同的情况B,它不会崩溃。

我的问题如下

  1. 为什么它首先会崩溃?我想这是关于动态加载的,但我不完全理解。
  2. 在情况 1 中,为什么它不会崩溃?
  3. 在情况2中,为什么它不会崩溃?
  4. 有没有其他方法可以解决这个问题-static?我认为如果用户在想要使用我的库时需要静态链接这些库,这很奇怪A
  5. 在情况 3 中,为什么它不会崩溃?我注意到许多 lib 的实现B都在标题中。是否涉及?

谢谢

4

0 回答 0