对 __isoc99_sscanf 的未定义引用

Posted

技术标签:

【中文标题】对 __isoc99_sscanf 的未定义引用【英文标题】:undefined reference to __isoc99_sscanf 【发布时间】:2016-08-31 22:35:58 【问题描述】:

我有一个使用sscanf 的静态C 库libex.a。库是使用-std=c99编译的

我想在使用 -std=c++11 编译的一些 C++ 代码中使用库函数,但出现以下错误:

lib/libex.a(srcfile.o): In function `my_function':
/srcpath/srcfile.c:215: undefined reference to `__isoc99_sscanf'

经过一番探索,我发现sscanf 存在版本问题,原因是向后兼容黑客,因此重定向到__isoc99_sscanf,所以我怀疑这是问题的根源。但是,我检查了我的 glibc 版本,它看起来足够新,以至于其他地方建议的解决方案(将您的 glibc 副本至少更新到 2.7)没有帮助。

$ ldd --version
ldd (Ubuntu EGLIBC 2.19-0ubuntu6.6) 2.19

有什么建议吗?

当然,如果有任何其他相关信息,请告诉我。

谢谢!

更新:如果我用-D_GNU_SOURCE 编译libex.a,错误消息将更改为undefined reference to sscanf。不确定这是否有助于找出问题所在。

【问题讨论】:

C++ 编译器'mangles' 函数名称。在 C 中创建的库没有损坏的函数名称。您在 C++ 源代码中包含哪些头文件?那些来自 C 语言的标头是否具有所需的 `extern "c" ... 包装器?所以它们可以在 C++ 中使用? 是的。所有标头都用 extern "C" 包裹 如果您可以制作一个最小的代码示例,并为库和 c++ 程序提供准确的构建命令,将会有所帮助 好点。在尝试构建一个最小的示例时,我能够弄清楚发生了什么。 (C++ 代码链接到不支持 scanf 的非标准版本的 stdio.h)。谢谢! 另见问题:***.com/q/3660826/39648 【参考方案1】:

万一其他人遇到这个问题:

C++ 代码的 Makefile 使用标志 -nostdlib -nodefaultlibs -nostartfiles 禁用标准库和启动文件。相反,它链接到英特尔 SGX SDK 中包含的 stdio.h 版本,用于在 enclave 内运行。该版本已弃用 sscanf

【讨论】:

以上是关于对 __isoc99_sscanf 的未定义引用的主要内容,如果未能解决你的问题,请参考以下文章

__isoc99_sscanf() 有啥作用?

对 `_imp__SetupDiGetClassDevsA@16' 的未定义引用(即使使用 -lsetupapi)

对“imp____glewEnableVertexAttribArray”的未定义引用

对`__glewCreateShader`的未定义引用[重复]

快速数学导致对“__pow_finite”的未定义引用

CGAL:对 _createImage 的未定义引用