- ベストアンサー
C++で外部ライブラリーをソースにリンクさせる方法とは?
- C++で外部ライブラリーをソースにリンクさせる方法について説明します。
- コンパイル時にエラーが発生した場合、未解決の外部シンボルエラーが発生することがあります。
- クラスを使用したプログラムでエラーが発生する場合、クラスの実装が正しくされていない可能性があります。
- みんなの回答 (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%28v=vs.80%29 方法2-1) 上記をBATファイルにする 方法2-2) Makfileに依存関係を記述して、nmakeでビルドする
その他の回答 (3)
- koakino
- ベストアンサー率44% (22/50)
cppファイルがあるなら普通にプロジェクトに取り込んじゃえばいいと思います。 1. 『空のプロジェクト』を作ります 2. プロジェクトのフォルダにRoadDriver.cpp、Road.h、Road.cppをコピーします 3. メニューバーの『プロジェクト』→『既存項目の追加』でファイル選択画面を出します 4. 3を使って、2のファイルをすべてプロジェクトに追加します 5. ビルドします
お礼
プロジェクトに取り込んでみると、できました!! なんで!?っと思ってたんですがNo2の方のおかげで分かりました。 回答ありがとうございます!
- kmee
- ベストアンサー率55% (1857/3366)
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しか使ってなかったです。エディターはメモ帳でした。
- kmee
- ベストアンサー率55% (1857/3366)
プロジェクトはどうなってます? 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を使っています
お礼
コマンドラインだとそうやってコンパイルするんですか! 試してみると、ちゃんとコンパイルできました。 勉強になりました、ありがとうございます!