web-dev-qa-db-ja.com

g ++でファイルをリンクする

最近、(Ubuntuで)g ++でプログラムをコンパイルしようとしました。通常、私は(Windowsで)Dev-C++を使用しており、プロジェクトを作成して必要なすべてのファイルをそこに配置する限り、そこでうまく機能します。

プログラムのコンパイル時に発生するエラーは次のとおりです。

$filename.cpp: undefined reference to '[Class]::[Class Member Function]'

使用されるファイルは次のとおりです。

Main関数を含むソースコード(.cpp)ファイル。

関数プロトタイプを含むヘッダーファイル。

各関数の定義を含む.cppファイル。

どんな助けでもありがたいです。

13
E.O.

ソースファイルをコンパイルするだけでなく、コンパイルしてリンクしようとしたか、何かを忘れた可能性があります。

バリエーション1(すべてを1行で、常にすべてを再コンパイルします):

g++ -o myexecutable first.cpp second.cpp third.cpp [other dependencies, e.g. -Lboost, -LGL, -LSDL, etc.]

バリエーション2(段階的、ない場合は-oが指定されている場合、gccは入力ファイル名を再利用し、リンクしていない場合は拡張子を変更します。このバリエーションはメイクファイルに最適です。変更されていない部分をスキップできます):

g++ -c first.cpp
g++ -c second.cpp
g++ -c third.cpp
g++ -o myexecutable first.o second.o third.o [other dependencies]

バリエーション3(一部のプレースホルダー):

リストには記載しませんが、上記のパラメーターはプレースホルダーにもなります。 g++ -c *.cppは、現在のディレクトリにあるすべてのcppファイルをo(bject)同じ名前のファイルにコンパイルします。

全体として、IDEなしで実際に作業する必要がない限り、あまり心配する必要はありません。コマンドライン構文にそれほど熟練していない場合は、まずIDEを使用してください。

26
Mario

Gccのコマンドラインは次のようになります。

g++ -o myprogram class1.cpp class2.cpp class3.cpp main.cpp

欠落しているクラスメンバー関数が定義されているcppファイルを確認します。あなたはそれをgccに与えていないかもしれません。

2
Rémi

#include内の正しいfilename.cppタグを確認することもできます。 filename.cppmyclass.hと同じディレクトリにあるfilename.cppに含まれるコードを使用するとします。 g ++が未定義であると言うクラスはmyclass.hに含まれ、myclass.cppで定義されていると想定します。したがって、myclass.h内にfilename.cppを正しく含めるには、次のようにします。

  1. filename.cpp
#include <iostream>  
#include <myclass.h>  
//..source code.  
  1. メイクファイルで:
filename.o: myclass.C myclass.h filename.cpp
g++ -I./ -c filename.cpp -o filename.o

myclass.o: myclass.C myclass.h  
g++ -c myclass.C -o myclass.o

上記では、-I.をコンパイルするときのfilename.cppオプションの使用に注意してください。 -I<directory>は、g++部分に続くパスを検索パスに含めるよう-Iに要求します。こうすることで、myclass.hが正しく含まれるようになります。

より多くの情報(おそらくソース)がない場合、問題がどこにあるのか正確に言うことは困難です。すべての試みは暗闇の中で突き刺さることになります。

0
Sriram

メンバー関数(通常は_.h_または_.hpp_ファイルで)を宣言したが、メンバー関数のそれぞれの定義は(通常は_.cpp_ファイルで)省略していると思います。

C++では、次のようにクラスを宣言することができます。

_class foo {
  void x();
  void y();
}
_

そうなるcppファイルで

_void foo::x() {
   do_something()
}
_

foo::y()がないことに注意してください。

メンバーコードfoo::y()がコンパイル済みコード全体で参照されていない限り、これはコンパイル/リンクプロセスに問題を引き起こしません。

0