我在autotool
环境中。
我正在开发一个A
使用库B
并C
作为依赖项的库。
- 我
B
用libtool
所以输出是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中,为什么它不会崩溃?
- 有没有其他方法可以解决这个问题
-static
?我认为如果用户在想要使用我的库时需要静态链接这些库,这很奇怪A
- 在情况 3 中,为什么它不会崩溃?我注意到许多 lib 的实现
B
都在标题中。是否涉及?
谢谢