与使用名称空间的外部库链接时,如何解决 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 的发布版本时,为啥会出现未解决的外部错误?