電子書籍の厳選無料作品が豊富!

MinGW環境でC++の勉強を始めました。
簡単なサンプルのコンパイルをしてみたのですが、ソースファイルを一括してコンパイルすると問題ないのですが、個別にコンパイルしようとするとエラーがでてしまいまいます。
原因や対処法をご存じの方がいらっしゃいましたらご教示下さい。


一括でコンパイルすると問題なし
bash-3.1$ g++ -Wl,--enable-auto-import main.cpp point.cpp -lstdc++

個別にコンパイルしようとした場合
bash-3.1$ g++ -Wl,--enable-auto-import -o main.o main.cpp
C:\DOCUME~1\user\LOCALS~1\Temp\ccZrVmLp.o:main.cpp:(.text+0x16): undefined reference to `Point::Point()'
C:\DOCUME~1\user\LOCALS~1\Temp\ccZrVmLp.o:main.cpp:(.text+0x32): undefined reference to `Point::Point(int, int)'
C:\DOCUME~1\user\LOCALS~1\Temp\ccZrVmLp.o:main.cpp:(.text+0x3e): undefined reference to `Point::println()'
C:\DOCUME~1\user\LOCALS~1\Temp\ccZrVmLp.o:main.cpp:(.text+0x4a): undefined reference to `Point::println()'
collect2: ld returned 1 exit status


※ -Wl,--enable-auto-importは、他の警告を消すために入れました、無くても質問の問題に変化はありませんでした。


サンプルソース
---main.cpp---
#include<iostream>
#include "point.h"
using namespace std;

int main(){
Point p1,p2(4,5);
p1.println();
p2.println();
return 0;
}
-----------
---point.h---
class Point {
private:
int x, y;
static int count;
public:
Point();
Point( int, int );
void set( int, int );
void println();
};
-------------
---point.cpp---
#include<iostream>
#include"point.h"
using namespace std;

int Point::count;
Point::Point(){
this->x = this->y = 0;
++count;
}
Point::Point(int ax, int ay){
this->x = ax;
this->y = ay;
++count;
}
void Point::set( int ax, int ay ){
this->x = ax;
this->y = ay;
}
void Point::println(){
cout << "Point(" << x << "," << y << ")" << endl;
}
-----------

bash-3.1$ g++ -v
Using built-in specs.
COLLECT_GCC=D:\MinGW\bin\g++.exe
COLLECT_LTO_WRAPPER=d:/mingw/bin/../libexec/gcc/mingw32/4.5.0/lto-wrapper.exe
Target: mingw32
Configured with: ../gcc-4.5.0/configure --enable-languages=c,c++,ada,fortran,obj
c,obj-c++ --disable-sjlj-exceptions --with-dwarf2 --enable-shared --enable-libgo
mp --disable-win32-registry --enable-libstdcxx-debug --enable-version-specific-r
untime-libs --disable-werror --build=mingw32 --pref

A 回答 (2件)

コンパイルの各段階で、どこまで実行するか、は -o の出力ファイル名はまったく関係なく、オプションの有無で決まります。


もともとのgccのターゲットであるunix系OSでは、実行ファイルに決まった拡張子なんてありませんから。 main.o ってファイル名でも実行ファイルになります。

実行制御関係のオプションが無ければ、ソースコードからリンクして実行ファイルにするまでの一連の作業が実行されます。
分割コンパイルでオブジェクトファイルまでコンパイルを実行するなら -c (小文字)オプションを付けます。

g++ -Wl,--enable-auto-import -c main.cpp
# 今回の場合は、 main.cpp → main.oができるので、-oはあってもなくてもOK
    • good
    • 0
この回答へのお礼

教えて頂いたとおり -cをつけて問題なくmain.oを作成、最終的に実行ファイルを作成することができました。
gcc についての挙動についても理解を深めることができました。
本当にありがとうございました。

お礼日時:2011/02/03 20:16

そりゃぁリンクまでしようとしたらエラーになりますわなぁ.

    • good
    • 0
この回答へのお礼

ご回答ありがとうございます。
ですが、知識が乏しいために仰られた内容が理解できません。
もう少しわかりやすくご説明いただければ幸いです。

ソースファイルを個別にコンパイルして.oファイル?を作成して
それらを最終的にくっつけて一つの実行ファイルにするには
具体的にどの様な手法をとれば良いでしょうか?

お礼日時:2011/02/03 19:50

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!