LNK2019:从 CPP 代码调用 C 函数

LNK2019: Calling C function from CPP code

本文关键字:调用 函数 代码 CPP LNK2019      更新时间:2023-10-16

我创建了一个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

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

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