无法将C ++与C对象链接

时间:2014-02-16 07:39:33

标签: c++ c g++

我一直在尝试使用g ++编译器将cpp脚本链接到c文件。但我继续将.c文件中的全局变量声明为双重定义。

的.cpp

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

以下是我编译2个文件的方法。

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

3 个答案:

答案 0 :(得分: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文件。

答案 1 :(得分:2)

1)我会将extern "C" {...} INSIDE 放在标题中,而不是在标题之外。

2)问题是,我会在您的标题中添加extern int NoOfRecordsRead;

然后在一个......中实际声明“NoOfRecordsRead”,只有一个... C或C ++模块。

3)同样对ountryRecordType globalCountryDataArray[]也这样做。

答案 2 :(得分:0)

由hyde和FroggyDay提供的综合解决方案。我为我的cpp文件创建了一个.h,然后复制了我的

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

进入cppFile.h以及我的.cpp文件中的其他代码。

然后我按照hyde的解决方案在我的c标题中为全局变量放置extern

extern int NoOfRecordsRead;
extern CountryRecordType globalCountryDataArray [Max_Record_Size];

最后,在我的c文件中声明varibles。

int NoOfRecordsRead;
CountryRecordType globalCountryDataArray [Max_Record_Size];

然后我可以成功编译我的脚本。