C / C ++重复符号错误

时间:2012-05-03 19:05:21

标签: c++ c gcc compiler-errors g++

我目前正在尝试编译一个混合了cpp和c的现有项目。

我的makefile如下;

execute: mgnsvd.o multifit.o cit.o  main.o
    g++ -Wall -g multifit.o cit.o main.o mgnsvd.o -lgsl -lgslcblas -o execute 

main.o: main.cpp cit.cpp
    g++ -Wall -g -c main.cpp

cit.o: cit.cpp mgnsvd.c multifit.h
   g++ -Wall -g -c cit.cpp

multifit.o: multifit.c mgnsvd.c multifit.h
   g++ -Wall -g -c multifit.c

mgnsvd.o: mgnsvd.c
    g++ -Wall -g -c mgnsvd.c

我的主要是一个相当简单的

// global libraries
#include <iostream>

// local files
#include "cit.cpp"

// using directives
using std::endl;
using std::cout;

// main
int main(){

  cout << "Hello, world" << endl; 

 return 0;
}

如果注释#include“cit.cpp”它编译好。但是,如果我包含它,则会发生以下错误;

ld: duplicate symbol _first_function_in_cit in main.o and cit.o for architecture x86_64

_first_function始终是第一个函数,并且未在其他任何位置定义或甚至声明/使用。对象文件的grep确认函数似乎被合并到main.o中,但为什么呢?我之前没有参与过C ++ / C项目,所以也许我正在制作一些规范错误?我也在OSX,如果这有所作为。

对于记录,没有类 - .h文件包含一些结构和一些宏。

3 个答案:

答案 0 :(得分:4)

cit.cpp正在编译,并且也包含在main.cpp中,因此您将获得其中所有代码的两个副本。

答案 1 :(得分:3)

没有必要

 #include "cit.cpp"

cit.cpp被编译为一个单独的单元,后来被链接。

使用上面的include,你会得到两次代码,结果是重复的符号

答案 2 :(得分:2)

你正在编译cit.cpp以产生cit.o,并且你正在使用main.cpp中的#include "cit.cpp" attrocity再次编译它。所以你当然会得到重复的符号。