Невозможно связать C ++ с объектом C

0

Я пытался связать скрипт cpp с ac файлом с помощью компилятора g++. Но я продолжаю получать глобальный var в.c файле, объявленном как двойные определения.

.cpp

extern "C" 
{
#include "cFile.h"
}

Ниже приведен мой метод компиляции двух файлов.

g++ -c -o cFile.o cFile.c
g++ -c -o cppFile.o cppFile.cpp
g++ -o ExeFile cFile.o cppFile.o

Ниже приведено мое сообщение об ошибке.

cFile.o:(.bss+0x0): multiple definition of 'NoOfRecordsRead'
cppFile.o:(.bss+0x0): first defined here
cFile.o:(.bss+0x20): multiple definition of 'globalCountryDataArray'
cppFile.o:(.bss+0x20): first defined here
collect2: error: ld returned 1 exit status

Пожалуйста помоги. Заранее спасибо!

Ниже приведен мой исходный файл заголовка в соответствии с запросом.

#ifndef COUNTRY_DATA_H
#define COUNTRY_DATA_H

// ====================================================================

#include <stdlib.h>
#include <stdio.h>
#include <string.h>

// ====================================================================

#define TLD_LEN             2
#define COUNTRY_LEN         100
#define FIPS104_LEN         2
#define ISO2_LEN            2
#define ISO3_LEN            3
#define CAPITAL_LEN         100
#define REGION_LEN          100
#define CURRENCY_LEN        50
#define CURRENCY_CODE_LEN   3
#define No_Of_Rec_Fields        11
#define Max_Record_Size         250
#define Line_Char_Buffer_Size   400
#define LINE_DATA_DELIMITER     "," 
#define INPUT_FILE_NAME         "Countries.txt"

// ===================================================================
//const char*   LINE_DATA_DELIMITER     = ",";
//const char*   INPUT_FILE_NAME         = "Countries.txt";

typedef struct CountryRecord

{

    char TLD            [TLD_LEN+1];            // Top Level Domain code

    char Country        [COUNTRY_LEN+1];    

    char FIPS104        [FIPS104_LEN+1];        // Ctry code according to FIPS104 standard

    char ISO2           [ISO2_LEN+1];           // Ctry code according to ISO2    standard

    char ISO3           [ISO3_LEN+1];           // Ctry code according to ISO3    standard
    double ISONo;
    char Capital        [CAPITAL_LEN+1];    
    char Region         [REGION_LEN+1];         // E.g. Asia, Europe, etc.
    char Currency       [CURRENCY_LEN+1];       // Full name of currency
    char CurrencyCode   [CURRENCY_CODE_LEN+1];  // Currency abbreviation
    double Population;

}   CountryRecordType;

int NoOfRecordsRead;
CountryRecordType globalCountryDataArray [Max_Record_Size];


// ====================================================================

void readData ();
char* get_line (char *s, size_t n, FILE *f);
CountryRecordType createCountryRecord (char* aLine);
void displayRecordContent (CountryRecordType ctryRec);
void showAllRecords ();  
int findCountryRecord (const char* countryName);    
char* getCapital (const char* countryName); 
char* getCurrencyCode (const char* countryName);
// ====================================================================

#endif // COUNTRY_DATA_H
  • 0
    Возможно, вы захотите показать заголовочный файл cFile.h . Скорее всего, вы определяете переменные там, а не просто объявляете их.
  • 0
    Как выглядит cfile.h?
Показать ещё 3 комментария
Теги:
g++

3 ответа

3
Лучший ответ

Эта строка в файле cFile.h, строка int NoOfRecordsRead; должно быть:

extern int NoOfRecordsRead; // declare that this variable is defined somewhere

Затем, в вашем cFile.c, вы должны иметь

int NoOfRecordsRead; // define this variable in exactly one place

Что является проблемой в вашем текущем коде, вы определяете глобальную переменную в файле.h. Поэтому он определяется в каждом файле.o, где этот файл.h включен в компиляцию. И компоновщик не любит несколько определений. Определите материал в файлах.c/.cpp, которые скомпилируются только один раз, в один файл.o.

  • 0
    Я делаю то же самое для массива?
  • 0
    Пробовал тот же метод для массива. Выводит ту же ошибку. Хм ...
Показать ещё 1 комментарий
2

1) Я бы поставил extern "C" {...} ВНУТРИ вашего заголовка, а не снаружи.

2) Проблема в том, что я бы поставил extern int NoOfRecordsRead; в вашем заголовке.

Затем на самом деле объявить "NoOfRecordsRead" в одном... и только одном... C или C++ модуле.

3) Сделайте то же самое для ountryRecordType globalCountryDataArray[].

0

Совместными решениями, предоставляемыми hyde и FroggyDay. Я создал файл.h для моего файла cpp, а затем скопировал

extern "C" 
{
    #include "CountryData.h"    
}

в cppFile.h вместе с другими кодами из моего.cpp файла.

Затем я последовал за решением hyde, чтобы разместить extern для глобальных переменных в моем c-заголовке

extern int NoOfRecordsRead;
extern CountryRecordType globalCountryDataArray [Max_Record_Size];

Наконец, объявление varibles в моем c файле.

int NoOfRecordsRead;
CountryRecordType globalCountryDataArray [Max_Record_Size];

Затем я могу успешно скомпилировать свой сценарий.

  • 0
    Добро пожаловать в ТАК. Как работает этот сайт, вы не должны добавлять ответ «спасибо, это работает», но используйте зеленую галочку, чтобы выбрать один ответ как «это решило мою проблему».
  • 0
    okay.noted.thanks!

Ещё вопросы

Сообщество Overcoder
Наверх
Меню