1

現在、cpp と c が混在する既存のプロジェクトをコンパイルしようとしています。

私のメイクファイルは次のとおりです。

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 ファイルには、いくつかの構造体といくつかのマクロが含まれています。

4

3 に答える 3

4

の必要はありません

 #include "cit.cpp"

cit.cpp は別のユニットとしてコンパイルされ、後でリンクされます。

上記のインクルードを使用すると、コードが 2 回取得され、結果としてシンボルが重複します

于 2012-05-03T19:07:35.670 に答える
4

cit.cppは単独でコンパイルされており、 にも含まれてmain.cppいるため、その中のすべてのコードの 2 つのコピーを取得しています。

于 2012-05-03T19:07:53.897 に答える
2

cit.cpp をコンパイルして cit.o を生成#include "cit.cpp"し、main.cpp でその残虐行為を再度コンパイルしています。もちろん、重複したシンボルを取得しています。

于 2012-05-03T19:09:32.923 に答える