コンパイルしたところ下記のようなエラーが出ます。
RoadDriver.obj : error LNK2019: 未解決の外部シンボル "public: void __thiscall Ro
ad::setWidth(float)" (?setWidth@Road@@QAEXM@Z) が関数 _main で参照されました。
RoadDriver.exe : fatal error LNK1120: 外部参照 1 が未解決です。
今C++でクラスを勉強し始めたところです。
普通クラスにはコンストラクターがあるようですが、よく分かってないので使っていません。使わなくても、今回の場合大丈夫なようですが・・・
幅X長さX厚さで道路の体積をもとめるだけのプログラムなのですが、クラスを使うといきなり詰まりました。
下にソースを簡略化したものを載せます。これをコンパイルしても同じエラーが出ました。
ヘッダファイル(名前はRoad.h)は
class Road
{
public:
void setWidth(float w);
private:
float width;
};
別のCPPファイル(名前はRoad.cpp)に
#include "Road.h"
void Road::setWidth(float w)
{
width = w;
}
メインのソースファイル(名前はRoadDriver.cpp)で
#include <iostream>
#include <string>
#include "Road.h"
using namespace std;
int main()
{
Road road;
float w; // w = width(in feet)
cout <<"Enter the width of the road in feet: ";
cin >> w;
road.setWidth(w);
return 0;
}
です。
main()でユーザーから受け取った数値をクラスで作ったwidthに入れようとしています、それがクラスがちゃんと実装されていないのかうまくいかないようです。教科書とかで調べたりしたのですがどこが間違っているのか・・・分かりません。もし宜しければ回答お願いします。
No.4ベストアンサー
- 回答日時:
コマンドラインの場合は次の通り。
方法1)
cl RoadDriver.cpp Road.cpp
というように、全てのソースを指定する
方法2)
cl /c RoadDriver.cpp
cl /c Road.cpp
と/cを付けると、リンクせずにコンパイルして .objファイルを作り
cl RoadDriver.obj Road.obj
でリンクする。
Visual Studioはこれを自動化してくれる
http://msdn.microsoft.com/ja-jp/library/8we9bhf4 …
方法2-1)
上記をBATファイルにする
方法2-2)
Makfileに依存関係を記述して、nmakeでビルドする
コマンドラインだとそうやってコンパイルするんですか!
試してみると、ちゃんとコンパイルできました。
勉強になりました、ありがとうございます!
No.3
- 回答日時:
cppファイルがあるなら普通にプロジェクトに取り込んじゃえばいいと思います。
1. 『空のプロジェクト』を作ります
2. プロジェクトのフォルダにRoadDriver.cpp、Road.h、Road.cppをコピーします
3. メニューバーの『プロジェクト』→『既存項目の追加』でファイル選択画面を出します
4. 3を使って、2のファイルをすべてプロジェクトに追加します
5. ビルドします
プロジェクトに取り込んでみると、できました!!
なんで!?っと思ってたんですがNo2の方のおかげで分かりました。
回答ありがとうございます!
No.2
- 回答日時:
VS2010だと
ソリューション
+プロジェクト1
+source
+~.cpp
+header
+~.h
+プロジェクト2
+source
+~.cpp
+header
+~.h
という感じになっていませんか?
C/C++では
ソースをコンパイル→.OBJ オブジェクトファイル
↓
必要な.OBJと必要な.LIBをリンク→.exe / .lib / .dll 等
というのがビルドの基本の流れです。VisualStudioを使っていると、ボタン一つでできるので、意識してないかもしれませんが。
このビルドはVisual Studioではプロジェクト単位で行います。
このような手でやる面倒な作業をまとめて面倒みてくれるのが、Visual Studio等です。
で、「Road.cppをコンパイル忘れていた」とあるので
プロジェクト1にRoadDriver.cpp
プロジェクト2にRoad.cpp
が入っているのでは無いですか?
そのために、それぞれ独立してリンクしようとして、足りないものがリンクエラーになっています。
方法は大きく2つ。
(1) RoadDriver.cppと Road.cppを同じソリューションの同じプロジェクトに入れる。
ビルドすると、双方をコンパイル→できたオブジェクトを一つにリンク、というのを自動でやってくれるようになります。
(2) Road.cppのプロジェクトを「スタティックライブラリ」用にする
リンクされると、.libができる。それを、RoadDriverのプロジェクトのリンクの入力に加える
プロジェクトの依存関係を設定して、Road→RoadDriverの順にビルドするようにする。
(1)の方が簡単です。
(2)は、後に別のプログラムで.libだけ使う、という使い方ができます。「C 言語」として教わってきた「printf」などは、本当はこのようにして用意されたライブラリです。
この回答への補足
>ソースをコンパイル→.OBJ オブジェクトファイル
↓
必要な.OBJと必要な.LIBをリンク→.exe / .lib / .dll 等
というのがビルドの基本の流れです。VisualStudioを使っていると、ボタン一つでできるので、意識してないかもしれませんが。
なるほど~!!
だからVCのプロジェクトに取り込むと問題なくコンパイルできたんですね!これまでCPPファイルを2つ以上に分けて書いたことがなくて、方法(2)のようなリンクの仕方は知りませんでした。VCは持ってたんですが最近までツールのCommand Promptしか使ってなかったです。エディターはメモ帳でした。
No.1
- 回答日時:
プロジェクトはどうなってます?
Road.cppとRoadDriver.cppが一つのプロジェクトに入ってますか?
あるいは、Road.cppから作ったRoad.objかRoad.libをリンクするように設定されていますか?
この回答への補足
>あるいは、Road.cppから作ったRoad.objかRoad.libをリンクするように設定されていますか?
リンクするように設定というと同じワーキングフォルダーにファイルを入れておけばいいということでしょうか?
それがRoad.cppをコンパイルし忘れていて、それで今そっちもコンパイルしようとしたのですが同じようなエラーが出てしまいます。これ以上外部ファイルはないし・・・関数の構文は間違ってないと思うし・・・なぜコンパイルできないのでしょうか?
↓がそのエラーです。
/out:Road.exe
Road.obj
LIBCMT.lib(crt0.obj) : error LNK2019: 未解決の外部シンボル _main が関数 ___tmain
CRTStartup で参照されました。
Road.exe : fatal error LNK1120: 外部参照 1 が未解決です。
あと補足ですがコンパイルにはVS 2010を使っています
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- C言語・C++・C# C++初心者です stirng 2 2022/09/20 20:43
- C言語・C++・C# C++プログラミングコードにポリモーフィズムを取り入れ方を教えてください。 2 2023/06/09 11:17
- 英語 この英文のwhat節について 2 2022/11/10 18:15
- C言語・C++・C# C++のcinの動作 5 2023/02/26 00:13
- C言語・C++・C# const char** p;のとき、free(p)でC4090エラーとなるのはなぜですか 3 2023/03/31 16:28
- C言語・C++・C# C言語: ポインタ 5 2022/06/01 08:33
- 洋楽 MadMax ナイトクラブの女性歌手の名前 1 2023/01/15 12:15
- C言語・C++・C# 並列プログラミングのπ計算について 1 2022/07/16 22:30
- 英語 be queued 2 2023/05/14 22:33
- 英語 凍結路面の英訳 4 2023/01/25 11:47
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
VBAを何回も作り直して、容量が...
-
” OS ビルド ” の意味が分か...
-
<math.h>があるのにsqrtが・...
-
1 つ以上の複数回定義されてい...
-
ILSpyで、デコンパイルできない。
-
「fatal error C1189」を回避す...
-
エクセルVBAではRound...
-
外部シンボル "_main"は未解決です
-
C言語でヘッダファイルにグロー...
-
OpenCVを Borland C++ Builder...
-
RPGでプログラムからソースファ...
-
セミコロンについて
-
Makefile作成時の拡張子.oとは?
-
pyc 編集 閲覧
-
bccでwinmm.libをリンクする方...
-
マクロ コンパイルがグレーバック
-
戻り値について
-
定数式とはどういう意味でしょ...
-
PRO*C コンパイルエラー
-
コマンドプロンプトで壁にぶち...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
VBAを何回も作り直して、容量が...
-
<math.h>があるのにsqrtが・...
-
” OS ビルド ” の意味が分か...
-
Makefile作成時の拡張子.oとは?
-
「fatal error C1189」を回避す...
-
1 つ以上の複数回定義されてい...
-
ILSpyで、デコンパイルできない。
-
C言語でヘッダファイルにグロー...
-
エクセルVBAではRound...
-
セミコロンについて
-
マクロ コンパイルがグレーバック
-
C++コンパイル時に『 C1083: in...
-
外部シンボル "_main"は未解決です
-
PRO*C コンパイルエラー
-
コンパイルエラー:ユーザ定義...
-
クリティカルエラー Expressio...
-
ビルドとリビルドの違いを教え...
-
RPGでプログラムからソースファ...
-
戻り値について
-
C++のhppファイルをCでinclude
おすすめ情報