与使用名称空间的外部库链接时,如何解决 C 中未定义的引用?

Posted

技术标签:

【中文标题】与使用名称空间的外部库链接时,如何解决 C 中未定义的引用?【英文标题】:How to solve undefined references in C when linking with an external library that uses name space? 【发布时间】:2014-08-06 06:17:36 【问题描述】:

我正在将我的程序链接到一个外部静态库。

这是我看到的众多错误之一:

undefined reference to `tcp_outratectl_tmofactor'

这在外部库c文件中定义为:

int tcp_outratectl_tmofactor = 1;

这个在我的程序中使用如图:

/* This is just a snippet */
extern int tcp_outratectl_timerticks;
if (count) 
    tcp_outratectl_timerticks = *count;

我从库中提取了目标文件并尝试查找符号

$ nm -A ./*.o | grep tcp_outratectl_timerticks
./tcp_timer.o:0000000000000018 B rumpns_tcp_outratectl_timerticks
./tcp_usrreq.o:                 U rumpns_tcp_outratectl_timerticks

如您所见,tcp_outratectl_tmofactor 是一个全局 BSS 符号,但它后面有“rumpns_”前缀,这会导致链接器错误。

我该如何解决这个问题?

【问题讨论】:

你链接的是 C 还是 C++? 我正在链接 C 这很奇怪,我以为 C 不会做任何类型的名称修改。 @merlin2011,C 有一些修饰方案,至少对于函数来说,以区分不同的调用约定。 @EricZ,我每天都能学到新东西。 :) 【参考方案1】:

我正在使用的外部库在还不是其命名空间一部分的符号后面添加了“rumpns_”。

修改 makefile 以删除此行为对我有用

【讨论】:

以上是关于与使用名称空间的外部库链接时,如何解决 C 中未定义的引用?的主要内容,如果未能解决你的问题,请参考以下文章

当我想在 C++ Builder Starter 中链接静态库 TinyXML 2 的发布版本时,为啥会出现未解决的外部错误?

在C ++命名空间中包含旧库

交叉编译时如何使用外部库?

检查“与外部库链接”示例时的矛盾结果

如何使用标准库包名称解决 Python 包中的命名空间冲突?

用 C++ 链接 C 库