アプリ版:「スタンプのみでお礼する」機能のリリースについて

【VS2008 C++】2つのプロジェクト間で共通の関数を使いたい

WindowsXP上で visual studio 2008 C++ express editionを
使用しています。

1つのソリューションに2つのプロジェクトをつくり、
その2つに共通の関数を使用させたいのですが、どのように
設定すればよいか教えて頂けませんでしょうか。


ソースの内容は以下のとおりです。
具体的には、mainB.cppでcommon.cppの関数を
呼び出したいです。
//common.cpp
#include <stdio.h>
void showCommon(){
printf("---common-----\n");
}

//common.h
#include<stdio.h>
void showCommon();

//mainA.cpp
#include<stdio.h>
#include "common.h"
void main(){
printf("---mainA-----\n");
showCommon();
}


//mainB.cpp
#include<stdio.h>
#include "common.h"
void main(){
printf("---mainB-----\n");
showCommon();

}

「【VS2008 C++】2つのプロジェク」の質問画像

A 回答 (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ファイル)を設定すればよいかと思います。

この回答への補足

ご回答、有難うございます。
(大変返信が遅れてすみません。)


>おそらく、この関数「showCommon()」はスタティックライブラリとして作ってい
>るLIBファイルに実体があると思いますが、そのLIBファイルが正しく参照できて
>いないのではないかと思います。
>
>#3の対策1のように、今度はリンカの設定で「追加のライブラリパス」を設定し、
>「追加の依存ファイル」に作成してあるスタティックライブラリ(LIB ファイル)
>を設定すればよいかと思います。

上記の内容ですが、スタティックライブラリを作った覚えはないのですが、
どこを参照すれば、それが作成されていることを確認できますか。
(どのようにすれば、作成できますか。)

また、「追加のライブラリパス」の項目はどこにあるのでしょうか。
(「ソリューションエクスプローラ」の「projetctB」の「プロパティ」の
「構成プロパティ」の「リンカ」の「全般」や「入力」などを調べましたが、
「追加のライブラリパス」という項目はありませんでした。
 (「追加のライブラリディレクトリ」という項目にCommon.h, Common.cppが
  居るフルパスフォルダ名を入力してもprojectBはビルドできていません。)

補足日時:2010/06/06 09:57
    • good
    • 0
この回答へのお礼

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

お礼日時:2010/07/11 12:16

私の場合ですと、ディレクトリを


common
mainA
mainB
と3つ作って、必要なファイルをそれぞれのプロジェクトに登録し、mainA.cpp,mainB.cppからは、

#include "..\\common\\common.h"
という感じにすることが多いですね。
再利用を考える場合はライブラリを作りますが、そこまで必要じゃない場合も多いので。

この回答への補足

ご回答、ありがとうございます。
(返信おくれてすみません。)

>ディレクトリを
>common
>mainA
>mainB
>と3つ作って、必要なファイルをそれぞれのプロジェクトに登録し
これは、具体的にどういう操作をすれば宜しいのでしょうか。

補足日時:2010/05/22 15:52
    • good
    • 0

>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のカレントフォルダにコピーする

あたりが考えられるかと・・・

この回答への補足

ご回答、有難うございます。
(返信送れてすみません。)

ご指摘頂いたように、projectBのカレントフォルダにcommon.hがないから
認識してくれないのですね。

対策案1をやってもできませんでした。
ソースを全く変えずに、こちらを参考にしてcommon.hのあるフォルダに
パスを通しましたが、できませんでした。
http://detail.chiebukuro.yahoo.co.jp/qa/question …
エラー内容は以下のとおりです。
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については確認していません。
コピーしてしまったら、今回の趣旨から外れてしまうので。

補足日時:2010/05/22 15:38
    • good
    • 0

実質回答者さんがすでに答えてるので、蛇足ですが。



3つやりかたがあります。

1. すでに回答者さんが解説されていますが、ソースコードを共有する方法です。基本的には、もう一方のプロジェクトに追加するだけで利用可能です。

2. ライブラリにする方法です。関数用のプロジェクトを作成し、プロジェクトの出力をexeからlibに変更、そして別のプロジェクトの「読み込むライブラリ」に指定します

3. dllにする方法です。
これは難しいから略で

この回答への補足

ご回答、有難うございます。

2のスタティックライブラリでやろうと思い、
以下のページを参考にしました。
http://www.kijineko.co.jp/tech/how-to-library/vc …
(mainB.cppのソースは一切変更していません。)

しかしながら、リビルドをすると#1さんへの補足と同じ
>fatal error C1083: include ファイルを開けません。'common.h': No such file or directory
が出力されています。

なんとなくですが、何か根本的なことが
間違っているように感じます。

補足日時:2010/05/17 02:28
    • good
    • 0

ソリューションエクスプローラーのprojectBのソースファイル上で右クリック。


「追加」「既存の項目」でcommon.cppを選択。
同様に行い、projectBのヘッダファイルにcommon.hを追加。

この回答への補足

ご回答、有難うございます。

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

補足日時:2010/05/17 01:56
    • good
    • 0

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

このQ&Aを見た人はこんなQ&Aも見ています


このQ&Aを見た人がよく見るQ&A