动态链接和遇到dyld:惰性符号绑定失败:未找到符号:

时间:2012-12-07 10:31:52

标签: c++ dynamic-linking libtool

我在autotool环境中。

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

  • 我使用B构建libtool,因此输出为libB.la
  • 我使用简单的Makefile构建C,输出为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代码中评论它们,它就不会崩溃。
  • 案例1:如果我在C中明确地使用test.cpp编写代码,则不会崩溃。
  • 案例2:如果我添加AM_LDFLAGS = -static,则不会崩溃。
  • 案例3:我试图用B模拟相同的情况,它不会崩溃。

我的问题在下面

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

0 个答案:

没有答案