Visual C++ 2017,外部“C”被忽略了吗?将 C++ 代码链接到 C 库时出现 LNK2019 错误
Posted
技术标签:
【中文标题】Visual C++ 2017,外部“C”被忽略了吗?将 C++ 代码链接到 C 库时出现 LNK2019 错误【英文标题】:Visual C++ 2017, extern "C" ignored? LNK2019 errors when linking C++ code to C libraries 【发布时间】:2018-01-03 03:31:11 【问题描述】:一个解决方案的项目包含一个用 C 编写的静态库(一个 .h 文件、一个 .c 文件)和一个基于该库的用 C++ 编写的实用程序 (.cxx)。
库编译没有错误。该实用程序也可以编译,但无法链接并出现以下错误:
1>abc.obj : error LNK2019: unresolved external symbol "struct DEFListen * __cdecl DEFisten(int,char *,int)" (?DEFListen@@YAPAU0@HPADH@Z) referenced in function _main
库的标头包括外部“C”保护:
#ifdef __cplusplus
extern "C"
#endif
通过将垃圾放入 ifdef 中,我在编译(而不是链接)实用程序时会按预期收到编译警告,因此我知道 __cplusplus 实际上是在编译实用程序时定义的,而不仅仅是拼写错误。
然而,错误消息显示了相关函数的函数签名(和错误名称)。实用程序的目标文件中的dumbin /symbols
当然可以确认该对象包含损坏的符号。
总而言之:extern "C"
肯定在编译时被解析但被忽略了。为什么?
【问题讨论】:
建议您尝试创建一个实际的 miaimal 示例来展示问题,而不是仅仅告诉我们您(认为您)知道的事情 :-) 通常这个过程很明显为什么你有问题。 刚刚在本地测试过,它按预期工作。我们在很多事情上都使用 C 库,所以我没想到它不会。 【参考方案1】:问题太愚蠢了:右大括号代码(如下)已被剪切并粘贴到另一个位置,同时重新安排声明,将几个函数留在 extern 块之外。
#ifdef __cplusplus
#endif
抱歉,在发帖寻求帮助之前我没有发现这一点。
我把这个可耻的帖子留给将来同样愚蠢的人(可能是我)发现。
【讨论】:
以上是关于Visual C++ 2017,外部“C”被忽略了吗?将 C++ 代码链接到 C 库时出现 LNK2019 错误的主要内容,如果未能解决你的问题,请参考以下文章
在 Visual Studio c++ 项目中将 Eigen 外部库放在哪里?
Visual Lisp:如何调用外部 C++ DLL 中的函数