Я пытался связать скрипт 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
Эта строка в файле 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.
1) Я бы поставил extern "C" {...}
ВНУТРИ вашего заголовка, а не снаружи.
2) Проблема в том, что я бы поставил extern int NoOfRecordsRead;
в вашем заголовке.
Затем на самом деле объявить "NoOfRecordsRead" в одном... и только одном... C или C++ модуле.
3) Сделайте то же самое для ountryRecordType globalCountryDataArray[]
.
Совместными решениями, предоставляемыми 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];
Затем я могу успешно скомпилировать свой сценарий.
cFile.h
. Скорее всего, вы определяете переменные там, а не просто объявляете их.