• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:【VS2008 C++】2つのプロジェクト間で共通の関数を使いたい)

【VS2008 C++】2つのプロジェクト間で共通の関数を使用する方法

このQ&Aのポイント
  • WindowsXP上でvisual studio 2008 C++ express editionを使用しています。1つのソリューションに2つのプロジェクトを作成し、その2つに共通の関数を使用したいです。具体的には、mainB.cppでcommon.cppの関数を呼び出したいです。
  • 2つのプロジェクト間で共通の関数を使用する方法を教えてください。WindowsXP上でvisual studio 2008 C++ express editionを使用しています。ソリューション内の2つのプロジェクトで、common.cppの関数を呼び出す方法を知りたいです。
  • WindowsXP上でvisual studio 2008 C++ express editionを使用しています。2つのプロジェクトを作成し、common.cppの関数をどのように呼び出せばいいのか教えてください。mainB.cppでcommon.cppの関数を使用したいです。

質問者が選んだベストアンサー

  • ベストアンサー
  • reset_cat
  • ベストアンサー率68% (94/138)
回答No.5

>mainB.obj : error LNK2019: 未解決の外部シンボル "void __cdecl showCommon(void)" (?showCommon@@YAXXZ) が関数 _main で参照されました。 >D:\C\project02\Debug\projectB.exe : fatal error LNK1120: 外部参照 1 が未解決です。 このエラーのみが出ているのであれば、common.hのインクルードは成功してます。 このエラーは「関数定義はあったが、実体が見つからない」というものです。 おそらく、この関数「showCommon()」はスタティックライブラリとして作っているLIBファイルに実体があると思いますが、そのLIBファイルが正しく参照できていないのではないかと思います。 #3の対策1のように、今度はリンカの設定で「追加のライブラリパス」を設定し、「追加の依存ファイル」に作成してあるスタティックライブラリ(LIBファイル)を設定すればよいかと思います。

yuki7091
質問者

お礼

長期間経ちましたので、一度この質問と閉じさせて頂きます。 ご協力してくださった方、ありがとうございました。

yuki7091
質問者

補足

ご回答、有難うございます。 (大変返信が遅れてすみません。) >おそらく、この関数「showCommon()」はスタティックライブラリとして作ってい >るLIBファイルに実体があると思いますが、そのLIBファイルが正しく参照できて >いないのではないかと思います。 > >#3の対策1のように、今度はリンカの設定で「追加のライブラリパス」を設定し、 >「追加の依存ファイル」に作成してあるスタティックライブラリ(LIB ファイル) >を設定すればよいかと思います。 上記の内容ですが、スタティックライブラリを作った覚えはないのですが、 どこを参照すれば、それが作成されていることを確認できますか。 (どのようにすれば、作成できますか。) また、「追加のライブラリパス」の項目はどこにあるのでしょうか。 (「ソリューションエクスプローラ」の「projetctB」の「プロパティ」の 「構成プロパティ」の「リンカ」の「全般」や「入力」などを調べましたが、 「追加のライブラリパス」という項目はありませんでした。  (「追加のライブラリディレクトリ」という項目にCommon.h, Common.cppが   居るフルパスフォルダ名を入力してもprojectBはビルドできていません。) )

その他の回答 (4)

  • titokani
  • ベストアンサー率19% (341/1726)
回答No.4

私の場合ですと、ディレクトリを common mainA mainB と3つ作って、必要なファイルをそれぞれのプロジェクトに登録し、mainA.cpp,mainB.cppからは、 #include "..\\common\\common.h" という感じにすることが多いですね。 再利用を考える場合はライブラリを作りますが、そこまで必要じゃない場合も多いので。

yuki7091
質問者

補足

ご回答、ありがとうございます。 (返信おくれてすみません。) >ディレクトリを >common >mainA >mainB >と3つ作って、必要なファイルをそれぞれのプロジェクトに登録し これは、具体的にどういう操作をすれば宜しいのでしょうか。

  • reset_cat
  • ベストアンサー率68% (94/138)
回答No.3

>fatal error C1083: include ファイルを開けません。'common.h': No such file or directory 2つのプロジェクトは、それぞれカレントフォルダが別々に設定されています。今回の場合、「common.h」がProjectAのカレントフォルダに配置されていると思いますが、ProjectBでそれらを追加しても・・・ #include "common.h" このインクルードはカレントフォルダと、「追加のインクルードパス」にあるフォルダの中から探しにゆくため、ProjectAのカレントフォルダにある「common.h」は見つからないというエラーになります。 対策としては、 1:ProjectBの追加のインクルードパスにProjectAのカレントフォルダを指定する 2:#include "「ProjectAのカレントフォルダ¥」common.h"に変更する 3:「common.h」をProjectBのカレントフォルダにコピーする あたりが考えられるかと・・・

yuki7091
質問者

補足

ご回答、有難うございます。 (返信送れてすみません。) ご指摘頂いたように、projectBのカレントフォルダにcommon.hがないから 認識してくれないのですね。 対策案1をやってもできませんでした。 ソースを全く変えずに、こちらを参考にしてcommon.hのあるフォルダに パスを通しましたが、できませんでした。 http://detail.chiebukuro.yahoo.co.jp/qa/question_detail/q1423096134 エラー内容は以下のとおりです。 mainB.obj : error LNK2019: 未解決の外部シンボル "void __cdecl showCommon(void)" (?showCommon@@YAXXZ) が関数 _main で参照されました。 D:\C\project02\Debug\projectB.exe : fatal error LNK1120: 外部参照 1 が未解決です。 対策案2をやってもできませんでした。 mainB.cppのインクルード文を以下のように変更しましたが、 上記と同じエラーが発生しています。 #include "..\projectA\common.h" (フルパスで書いても駄目でした。) 対策3については確認していません。 コピーしてしまったら、今回の趣旨から外れてしまうので。

回答No.2

実質回答者さんがすでに答えてるので、蛇足ですが。 3つやりかたがあります。 1. すでに回答者さんが解説されていますが、ソースコードを共有する方法です。基本的には、もう一方のプロジェクトに追加するだけで利用可能です。 2. ライブラリにする方法です。関数用のプロジェクトを作成し、プロジェクトの出力をexeからlibに変更、そして別のプロジェクトの「読み込むライブラリ」に指定します 3. dllにする方法です。 これは難しいから略で

yuki7091
質問者

補足

ご回答、有難うございます。 2のスタティックライブラリでやろうと思い、 以下のページを参考にしました。 http://www.kijineko.co.jp/tech/how-to-library/vc-project.html (mainB.cppのソースは一切変更していません。) しかしながら、リビルドをすると#1さんへの補足と同じ >fatal error C1083: include ファイルを開けません。'common.h': No such file or directory が出力されています。 なんとなくですが、何か根本的なことが 間違っているように感じます。

回答No.1

ソリューションエクスプローラーのprojectBのソースファイル上で右クリック。 「追加」「既存の項目」でcommon.cppを選択。 同様に行い、projectBのヘッダファイルにcommon.hを追加。

yuki7091
質問者

補足

ご回答、有難うございます。 common.cpp, common.hをprojectBに追加しました。 しかしながら、リビルドしても >fatal error C1083: include ファイルを開けません。'common.h': No such file or directory と出力されて、commonファイルたちを認識してくれません。

関連するQ&A