2013-11-22 87 views
4

我正在使用VS2008。我收到以下錯誤。C2732 - 鏈接規範錯誤

BUILD: [02:0000000295:ERRORE] c:\wince700\platform\am33x_bsp\src\bootloader\bootpart\bootpart_e.cpp(61) : error C2732: linkage specification contradicts earlier specification for 'SdhcInitialize' {log="C:\WINCE700\platform\AM33X_BSP\SRC\BOOTLOADER\bldsys.log(103)"} 
BUILD: [02:0000000297:ERRORE] NMAKE : fatal error U1077: 'C:\WINCE700\sdk\bin\i386\ARM\cl.EXE' : return code '0x2' {log="C:\WINCE700\platform\AM33X_BSP\SRC\BOOTLOADER\bldsys.log(104)"} 
BUILD: [02:0000000299:ERRORE] clean TargetCompilePass -nologo BUILDMSG=Stop. BUILDROOT=C:\WINCE700\platform\AM33X_BSP CLEANBUILD=1 NOLINK=1 NOPASS0=1 failed - rc = 2. {log="C:\WINCE700\platform\AM33X_BSP\SRC\BOOTLOADER\bldsys.log(105)"} 

file_1.cpp

extern "C" 
{ 
    // some extern declarations 
    extern void SdhcInitialize(DWORD slot); 
} 

file_2.c

void SdhcInitialize(DWORD slot) 
{ 
//some code 
} 

請指導我如何去解決。

+2

什麼是SD_API_STATUS?還有更多寫在錯誤日誌中?請更新問題以包含完整(和未編輯)的日誌。 –

+2

您確定沒有'SdhcInitialize'的其他聲明/定義? – user694733

+0

我假設這是一個狀態碼返回類型,而不是一個帶有聲明說明符的宏。 – Potatoswatter

回答

6

我猜你有一個包含了SdhcInitialize()函數原型頭,並且頭球被C程序使用寫的。因此,例如,頭文件可能包括類似於下面的行:

SD_API_STATUS SdhcInitialize(DWORD slot); 

而不被封閉在extern "C" {}塊(因爲報頭是用於C程序)。

此外,我懷疑是包括在本標題 - 直接或間接地 - 通過file_1.cpp

這意味着,報頭可以不被包括在C++程序沒有某些附加的工作被完成,否則該C++程序將看到該聲明的含義是SdhcInitialize()具有C++鏈接。

你有兩個合理的方法來解決這個:

  • ,如果你可以修改標題,加上週圍的聲明如下行頭:

    #if __cplusplus 
        extern "C" { 
        #endif 
    
        // declarations go here 
    
        #if __cplusplus 
        } 
        #endif 
    

    這樣,C++文件將有一個extern "C"鏈接塊中包含的聲明,而C程序將不會看到extern "C"位(否則會混淆C編譯器)。

    我認爲所有C頭文件都應該包含類似於這些行的東西,這樣C函數就可以被C++程序使用,而且沒有麻煩。

  • ,如果你不能修改出於某種原因,頭,你可以通過在C中的頭解決問題++文件,像這樣:

    extern "C" { 
        #include "Sdhc-header.h" 
        } 
    
+0

謝謝。我已經提到了'__cplusplus',但錯誤依然存在。你提到'我懷疑這個頭文件是被file_1.cpp直接或間接包含的。實際上,我有另一個擴展名爲'.c'的文件,其中我剛剛宣佈extern沒有「C」。這個錯誤背後有什麼原因嗎? – Gomu

+0

'bootpart_e.cpp'包含一些聲明'SdhcInitialize()'的文件(包括間接的)。如果你在確定這個時遇到困難,使用'/ P'選項將把預處理器的輸出發送到一個文件中,並且你可以搜索那個文件來查找'SdhcInitialize'的所有實例來查看聲明來自哪裏。 –

1

如果圍繞一組函數聲明extern "C" { ... },則不需要在函數標識符前面使用附加的extern關鍵字。

extern "C" 
{ 
    // some extern declarations 
    SD_API_STATUS SdhcInitialize(DWORD slot); 
} 
+0

謝謝。但是,即使刪除該extern也不會對該錯誤進行任何更改。 – Gomu

0

當您嘗試包括「一些頭「C++文件」中的「C」文件的文件(頭文件有一些地方extern "C"用於某些功能)。

包含標題前面會解決問題。

例如嘗試將#include "myHeader.h"移動到C++文件的頂部。

這解決了我的問題。

希望它有幫助....