我目前正在尝试编译一个由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文件包含一些结构和一些宏。

最佳答案

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

10-08 14:31