C++およびg++のコンパイルとリンクに関する次のnoobの質問にご協力ください。基本的に、2つの異なるファイルに2つのクラスがあり、それらをコンパイルできますが、リンクしようとすると、両方をリンクしていても、一方のクラスが他方のメソッドを見ることができません。この場合、オブジェクトファイルの順序は役に立ちません。
この問題は、パラメーターを受け取るデフォルト以外のコンストラクターに関連しているようです。
私は次の簡単なコードで問題を抽出して再現しました:
ファイル:a.cpp:
#include <iostream>
class A
{
public:
int my_int;
A(int i) {
my_int = i;
std::cout << "A";
}
};
ファイル:a.hpp:
#ifndef __A_H_
#define __A_H_
class A
{
public:
A(int i);
};
#endif
ファイルb.cpp:
#include <iostream>
using namespace std;
#include <a.hpp>
class B
{
public:
int my_int;
B(int i) {
my_int = i;
A a(i);
cout << "B\n";
}
};
int main(int argc, char* argv[])
{
B b(5);
cout << "hello world: ";
cout.flush();
return 0;
}
ビルドに使用するコマンド:
g++ -c -I. a.cpp
g++ -c -I. b.cpp
g++ -o c_test a.o b.o
あるいは、私はこれらのそれぞれを試しました:
g++ -o c_test b.o a.o
g++ -I. -o c_test a.cpp b.cpp
g++ -I. -o c_test b.cpp a.cpp
上記のリンクシナリオのいずれかで発生するエラー:
b.o: In function `B::B(int)':
b.cpp:(.text._ZN1BC1Ei[B::B(int)]+0x1c): undefined reference to `A::A(int)'
collect2: ld returned 1 exit status
洞察を事前に感謝します。
(これが再投稿の場合は申し訳ありません-私はそれを投稿したと思いましたが、表示されません...)