将外部库链接到项目仍然提供未定义的引用

时间:2016-04-05 09:08:36

标签: c++ compilation linker archive-file

我有一个librdma.a,我需要链接到我当前的项目。当我在librdma.a上运行 nm 时,这就是我得到的: -

0000000000000000 T set_attribute

这意味着该功能在代码中可用。

现在,当我尝试将此 .a 文件链接到我当前的项目并使用此 Makefile.am为其创建 .a 文件时 : -

noinst_LTLIBRARIES=     libsrc.la

libsrc_la_SOURCES=      One.cpp \
                        Two.cpp \

libsrc_la_CPPFLAGS =    -I$(top_srcdir)/inc -I$(rdma_dir)/include

libsrc_la_LIBADD =      -L$(rdma_dir)/lib -lrdma

这会创建一个libsrc.a文件,该文件在技术上应该具有set_attribute()的定义,这是我尝试使用的函数。但是当我在这个存档文件上运行 nm 时,我得到一个未定义的引用。

                 U _Z8set_attributePP5attrlPcS2_

另外,当我尝试制作整个项目时,反过来使用这个libsrc.a文件,我得到这样的错误: -

../libfinal/.libs/libfinal.so: undefined reference to `set_attribute()'

1 个答案:

答案 0 :(得分:1)

看起来您正在将C库与C ++库混合,并且C库的标头不会包含在extern C块中。因此,第一个库中的unmangled name,set_attribute,以及它引用的库中,你得到一个错误的名称_Z8set_attrPP5attrlPcS2 _。