2013-11-22 3 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', как упоминалось, но ошибка сохраняется. Вы упомянули «Я подозреваю, что этот заголовок включен - прямо или косвенно - файлом_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++.

Это решает мои проблемы.

Надеюсь, это поможет ....