【问题标题】:LNK2019: Calling C function from CPP codeLNK2019:从 CPP 代码调用 C 函数
【发布时间】: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
  1. test.cpp 已添加到 MFC 项目中,如下所示:
#include "linkertest.h"

void test1(void)
{
   testLinkerError();
}
  1. 头文件linkertest.h如下所示:
#pragma once

#ifdef _cplusplus
extern "C" {
#endif

void testLinkerError(void);

#ifdef _cplusplus
}
#endif
  1. 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
  • 我需要一把枪,这样我才能射中自己的头部。让我试着改正那个错字。
  • 这是一个常见的误解,认为这需要一把枪,而实际上使用弩或坠落的钢琴可以达到相同的最终结果...... ;) 但说真的,请不要伤害自己。这不是从错误中吸取教训的有效方法。

标签: c++ c visual-studio mfc visual-studio-2015


【解决方案1】:

基于编译器错误,您的编译器尝试查找 ?testLinkerError@@YAXXZ,这是一个 C++ 函数名称。所以这意味着在你的导入部分(不是你的 DLL 导出)你没有使用extern "C"....

还有一件事,名称__cplusplus(两个下划线)在编译C++ 翻译单元时被定义为值201402L。请检查您的代码,确保已定义 _cplusplus(一个下划线)。

【讨论】:

  • 问题确实是缺少下划线!我在这上面花了 2 个小时,结果证明它是一种类型。我现在想朝自己的脑袋开枪。非常感谢你们! :-)
猜你喜欢
  • 1970-01-01
  • 2013-05-26
  • 2011-10-20
  • 1970-01-01
  • 2018-02-10
  • 2013-07-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多