过去一天一直在处理链接器地狱,并想我会把它扔在那里,看看是否有人可以帮助我。
我正在构建两个共享库:一个称为“libhttp”,它具有一些用于 http 协议的帮助函数,似乎正在构建更好或更坏的 OK。第二个称为“libvpcutil”,它导致了问题。它取决于 libhttp 中的符号,因此我将其链接到 libhttp。这是编译指令(从 make 文件中分解出来的),其中包含一些小东西,比如我个人的 openssl 生成路径:
g++ -shared -Wl,-soname,libvpcutil.so.1 -o libvpcutil.so.1.0 vpcreg/registry.o \
vpcreg/vpcreg2.o dbase/dbase.o dbase/sqlutils.o diaglog/diaglog.o errmsg/errmsg.o \
faillib/faillib.o failover/failover.o initerr/init_err.o kmq/kmq.o kmq/publish.o \
kthread/kcom.o kthread/kthread.o libobdi/odi_serv.o mutex/mutex.o netserv/netserv.o \
newmem/newmem.o rmtstore/avlmem.o rmtstore/rmtstore.o rmtstore/shm_aloc.o \
servhand/servhand.o timers/timers.o vpcstamp/vpcstamp.o websql/websql.o types/blob.o \
types/hitime.o types/ticks.o types/timestamp.o odasm/odasm.o webvibapi/webvibapi.o \
vibusfeed/vibusfeed.o propstore/propstore2.o cardlib/cardlib.o cardlib/sortlist.o \
gapi/genapi.o -L/usr/lib/i386-linux-gnu -lm -lrt -lxml2 -lodbc -L/usr/lib/i386-linux-gnu -\
lcurl -Wl,-Bsymbolic-functions -Wl,-z,relro \
-L/pathtoopenssl/openssl -lssl -lcrypto -lxml2 -lreadline -\
lcurses -Wl,-rpath=.:/pathtobin/bin http/libhttp.so.1.0 ../ddldata/ddldata.o
../cardddl/cardddl.o ../gendata/generic.o
编译和链接成功完成。希望您注意到 http/libhttp.so.1.0 的链接步骤。
现在,如果我在 libhttp.so.1.0 上执行 nm,我会得到以下输出(以及其他输出):
00015d5a T _ZN12http_cookiesC1Ev
00015d5a T _ZN12http_cookiesC2Ev
00015d7e T _ZN12http_cookiesD1Ev
00015d7e T _ZN12http_cookiesD2Ev
00011574 T _ZN12http_headers11url_expressERSo
00011466 T _ZN12http_headers12http_expressERSo
但是当我在 libvpcutil.so.1.0 上做一个 nm 时,我基本上得到:
U _ZN12http_cookiesC1Ev
U _ZN12http_cookiesD1Ev
U _ZN12http_headers11url_expressERSo
U _ZN12http_headers3setEPKcRKSs
U _ZN12http_headers3setEPKcS1_
U _ZN12http_headersC1Ev
U _ZN12http_headersD1Ev
我显然在这里剪断了,但我被困在这里的是符号在 libhttp 中明确定义,我为 libvpcutil 链接它,但随后符号在 libvpcutil 中未定义。这会产生运行时错误。
有人看到这个问题吗?