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

“error LNK2019: 无法解析的外部符号”之分析

error LNK2019: 无法解析的外部符号 ,该符号在函数 中被引用

lnk2001的问题

LNK2019“未解析的外部符号”错误(C++ OpenGL)