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 错误的主要内容,如果未能解决你的问题,请参考以下文章

Microsoft visual c++弹窗?

在 Visual Studio c++ 项目中将 Eigen 外部库放在哪里?

Visual Lisp:如何调用外部 C++ DLL 中的函数

如何在 Visual Studio 2017、C++、CMake 中使用数据断点?

visual 2017c++兼容2015c++吗

DLL 注入编译“未解析的外部符号”Visual Studio C++