LNK2019:从 CPP 代码调用 C 函数
Posted
技术标签:
【中文标题】LNK2019:从 CPP 代码调用 C 函数【英文标题】:LNK2019: Calling C function from CPP code 【发布时间】:2016-02-10 03:50:58 【问题描述】:我创建了一个 MSVS2015 项目 (MFC/C++) 与静态 C 库的链接。当我建立 项目我收到以下错误:
error LNK2019:
unresolved external symbol "void __cdecl testLinkerError(void)" (?testLinkerError@@YAXXZ) referenced
in function "void __cdecl test1(void)" (?test1@@YAXXZ) [PATH_REMOVED]\test.obj [NAME_OF_MFC_PROJECT]
出于调试目的,我创建了 3 个文件:
test.cpp
linkertest.c
linkertest.h
-
test.cpp 已添加到 MFC 项目中,如下所示:
#include "linkertest.h" void test1(void) testLinkerError();
-
头文件linkertest.h如下所示:
#pragma once #ifdef _cplusplus extern "C" #endif void testLinkerError(void); #ifdef _cplusplus #endif
-
linkertest.c 看起来像这样:
#include "linkertest.h" void testLinkerError(void) int x = 5; int y = 7; int z = x + y;
我很确定这是某种名称修改问题,但我不知道如何解决它。 两个项目中的调用约定都设置为 __cdecl
【问题讨论】:
你确定你的编译器提供_cplusplus
吗?我只见过它带有 两个 前导下划线,据我所知,这是最接近任何“标准”的。您确定您已将 .lib 文件包含在您的项目设置的 Additional Libraries 部分中并且它是为您正在编译的构建配置设置的吗?跨度>
刚刚看到@paddy 的评论,我相信这是正确的答案。 FWIW 链接器错误表明 C++ 编译忽略了extern "C"
部分,有关详细信息,请参阅Name Decoration。
我需要一把枪,这样我才能射中自己的头部。让我试着改正那个错字。
这是一个常见的误解,认为这需要一把枪,而实际上使用弩或坠落的钢琴可以达到相同的最终结果...... ;) 但说真的,请不要伤害自己。这不是从错误中吸取教训的有效方法。
【参考方案1】:
基于编译器错误,您的编译器尝试查找 ?testLinkerError@@YAXXZ
,这是一个 C++ 函数名称。所以这意味着在你的导入部分(不是你的 DLL 导出)你没有使用extern "C"
....
还有一件事,名称__cplusplus
(两个下划线)在编译C++ 翻译单元时被定义为值201402L。请检查您的代码,确保已定义 _cplusplus
(一个下划线)。
【讨论】:
问题确实是缺少下划线!我在这上面花了 2 个小时,结果证明它是一种类型。我现在想朝自己的脑袋开枪。非常感谢你们! :-)以上是关于LNK2019:从 CPP 代码调用 C 函数的主要内容,如果未能解决你的问题,请参考以下文章
C/C++ 混合程序中的错误 LNK2005 和错误 LNK2019