2016-02-10 81 views
1

我创建了一个MSVS2015项目(MFC/C++),其中 链接到一个静态C库。当我建立 项目,我得到以下错误:LNK2019:从CPP代码调用C函数

error LNK2019: 
unresolved external symbol "void __cdecl testLinkerError(void)" ([email protected]@YAXXZ) referenced 
in function "void __cdecl test1(void)" ([email protected]@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(); 
} 
  • 头文件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

    +1

    你确定你的编译器提供'_cplusplus'吗?我从来没有见过它,带有两条主要的下划线,据我所知,这是最接近你的任何“标准”。你确定你已经在项目设置的Additional Libraries部分中包含了**。lib **文件_and_它是为你正在编译的构建配置设置的吗? – paddy

    +0

    刚看到@ paddy的评论,我相信这是正确的答案。 FWIW链接器错误表明C++编译忽略了'extern“C”'部分,详细信息请参见[名称装饰](https://msdn.microsoft.com/zh-cn/library/dexefa7.aspx)。 – dxiv

    +0

    我需要一把枪,所以我可以在头部拍摄自己。让我试着修复这个错字。 – user1884325

    回答

    2

    根据编译器错误,编译器试图查找[email protected]@YAXXZ这是一个C++函数名。因此,这意味着你的进口部分(不是你的DLL导出)您没有使用extern "C" ....

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

    +0

    问题确实是缺少的下划线!我花了2个小时在这个,它变成了一个类型。我现在感觉自己在头上开枪。非常感谢你们! :-) – user1884325

    +0

    @paddy:并感谢您的发现 – user1884325

    +0

    Yaay我赢了! =) – paddy