【问题标题】:"undefined reference to" for symbols in a shared library [duplicate]共享库中符号的“未定义引用”[重复]
【发布时间】:2013-02-02 19:57:28
【问题描述】:

可能重复:
Linker error on Linux: “undefined reference to”

我像这样链接一个共享库:

core : $(CORE_OBJS) | bin
    $(CC) $(LFLAGS) -o bin/libcbitcoin$(LIBRARY_EXTENSION) $(CORE_OBJS)

生成库文件 libcbitcoin.2.0.so。

但是,当生成链接到库的可执行文件时,链接器会抱怨对出现的每个符号都有未定义的引用。 makefile 像这样链接可执行文件:

$(TEST_BINARIES): bin/%: build/%.o
    $(CC) -lcbitcoin.$(LIBRARY_VERSION) -lpthread -lcbitcoin-crypto.$(LIBRARY_VERSION) -lcbitcoin-network.$(LIBRARY_VERSION) -lcbitcoin-file-ec.$(LIBRARY_VERSION) -lcbitcoin-storage.$(LIBRARY_VERSION) -lcbitcoin-rand.$(LIBRARY_VERSION) -L/opt/local/lib -levent_core -levent_pthreads -lcrypto -L$(BINDIR) $< -o $@

这给出了链接器选项-lcbitcoin.2.0

当我尝试为 Linux Mint 而不是 OSX 构建时,我只会遇到这个问题。完整的 makefile 在这里:https://github.com/MatthewLM/cbitcoin/blob/newNetworkCode/Makefile.in

autoconf 文件在这里(如果它很重要的话):https://github.com/MatthewLM/cbitcoin/blob/newNetworkCode/configure.ac

感谢您的帮助。

【问题讨论】:

  • 我知道我之前已经解决了这个问题,但我找不到。所以是的,它是重复的。 :-(

标签: c linux gcc shared-libraries ld


【解决方案1】:

编辑:链接器排序。

您不必为链接器行指定库扩展。只需 -lcbitcoin 就足够了。

此外,传递给链接器的库的顺序也很重要。排序与您可能期望的相反——您应该在 after 指定需要它的对象之后指定一个库。见:http://gcc.gnu.org/onlinedocs/gcc/Link-Options.html

【讨论】:

  • "你应该在指定需要它的对象之后指定一个库。"该死的,总是这么容易!另外,如果你有两个像我一样相互依赖的库,我必须这样做 -lliba -llibb -lliba
猜你喜欢
  • 2011-02-28
  • 2016-10-16
  • 1970-01-01
  • 2021-10-21
  • 2011-07-19
  • 2018-04-14
  • 2021-08-20
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多