2011-06-20 3 views
1

g ++リンカーについての情報はすばらしいものですが、これは何よりも設計上の問題です。C++リンカーの設計に関する質問

私は次のような構造に埋め込まれた.cppファイルを持っている:

Main 
Main/Utilities 
Main/Utilities/Data 

私がメインで、メインエントリポイント.cppファイルをコンパイルすると、私はすべての.cppは、任意のリンクされた.cppが今まで使用してファイルを指定する必要があります - これは5つのリンクされたファイルのような私のテストプロジェクトのためにうまくいきますが、このプロジェクトは非常に迅速に成長し、これは明らかに実行不可能です。これを回避する方法はありますか?これを引き起こしているのは何ですか?

「g ++ * .cpp」を使ってみましたが、まだ他のものをリンクさせたいと思っています。私は "g ++ main.cpp Utilities/other.cpp Utilities/Data/data.cpp"のようなことをしなければなりません。 other.cppはdata.cppを使い、main.cppはother.cppを使います。 other.cppをコンパイルするときは、前と同じようにdata.cppを指定する必要があります。

ご協力いただきありがとうございます。

+0

あなたはいくつかの用語を混乱させていると思います。 'g ++'はC++コンパイラであり、リンカではありません。しかし、あなたの利益のために、適切な引数を使ってバックグラウンドで(ほとんどのUNIXシステムでは 'ld'となる)リンカを起動します。 –

答えて

0

...私はすべての.cppは、任意のリンクされた.cppが今まで使用してファイルを指定する必要があります...

これはfalseです。コードで使用されているすべてのシンボルを解決するのに十分な情報をリンカに与える必要がありますが、ソースコードファイル(.cppなど)、オブジェクトファイル(.o)、ライブラリ(.soまたは。 a)。それぞれのソースコードファイルをオブジェクトファイルにコンパイルし、バイナリを作成するために各オブジェクトファイルをリンクするだけで十分です。

g++ foo.cpp -c -o foo.o 
g++ bar.cpp -c -o bar.o 
g++ main.cpp -c -o main.o 
g++ main.o foo.o bar.o -o main.exe 
3

大きなプロジェクトを管理するための一般的なアプローチは、(すでに場所で持っているような)適切なディレクトリ構造を使用し、各ディレクトリにMakefileを配置することです。最上位レベルMakefileは、必要な番号Makefilesを再帰的に呼び出す必要があります。各Makefileは、そのディレクトリからコンパイルされるソースファイル(および必要に応じて他のコンパイルフラグ)を指定する必要があります。理想的には、要件に応じて静的ライブラリ(または多分動的)を作成する必要があります。すべての依存コードがコンパイルされたら(つまり、.libまたは.oのファイルがあることを意味します)、エントリポイント(たとえば、mainはc/C++の関数)を持つソースファイルをコンパイルし、リンカに依存するライブラリを指定する必要があります(ld )。

例として、少なくとも2レベルのディレクトリ構造を持つオープンソースプロジェクトを見てください。

0

あなたは実際にはUNIXのようなシステムにいると仮定して、シェルは*.cppワイルドカードの指定を実際のファイル名に置き換えます。私はそれを疑うけれども、他のシステムは異なって振る舞います。

あなたはファイルをディレクトリ構造に保存していますので、単に*.cppと言うとg ++を呼び出すカレントディレクトリのファイルと一致します。おそらくmain.cppだけでしょう。

他のすべてのファイルをワイルドカードでカバーする場合は、コマンドラインでも指定する必要があります。あなたの場合:

g++ *.cpp Utilities/*.cpp Utilities/data/*.cpp 

実際にすべてのファイルに名前を付けるよりも簡単な場合は、私は判断できません。

EDIT:他の人のようにが言った、非自明なプログラムを構築/コンパイルするための最良の方法はmakeを使用して、もちろんであるか、いくつかの同等のビルドツール。

関連する問題