
【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();
}

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ファイル)を設定すればよいかと思います。
この回答への補足
ご回答、有難うございます。
(大変返信が遅れてすみません。)
>おそらく、この関数「showCommon()」はスタティックライブラリとして作ってい
>るLIBファイルに実体があると思いますが、そのLIBファイルが正しく参照できて
>いないのではないかと思います。
>
>#3の対策1のように、今度はリンカの設定で「追加のライブラリパス」を設定し、
>「追加の依存ファイル」に作成してあるスタティックライブラリ(LIB ファイル)
>を設定すればよいかと思います。
上記の内容ですが、スタティックライブラリを作った覚えはないのですが、
どこを参照すれば、それが作成されていることを確認できますか。
(どのようにすれば、作成できますか。)
また、「追加のライブラリパス」の項目はどこにあるのでしょうか。
(「ソリューションエクスプローラ」の「projetctB」の「プロパティ」の
「構成プロパティ」の「リンカ」の「全般」や「入力」などを調べましたが、
「追加のライブラリパス」という項目はありませんでした。
(「追加のライブラリディレクトリ」という項目にCommon.h, Common.cppが
居るフルパスフォルダ名を入力してもprojectBはビルドできていません。)
)
No.4
- 回答日時:
私の場合ですと、ディレクトリを
common
mainA
mainB
と3つ作って、必要なファイルをそれぞれのプロジェクトに登録し、mainA.cpp,mainB.cppからは、
#include "..\\common\\common.h"
という感じにすることが多いですね。
再利用を考える場合はライブラリを作りますが、そこまで必要じゃない場合も多いので。
この回答への補足
ご回答、ありがとうございます。
(返信おくれてすみません。)
>ディレクトリを
>common
>mainA
>mainB
>と3つ作って、必要なファイルをそれぞれのプロジェクトに登録し
これは、具体的にどういう操作をすれば宜しいのでしょうか。
No.3
- 回答日時:
>fatal error C1083: include ファイルを開けません。
'common.h': No such file or directory2つのプロジェクトは、それぞれカレントフォルダが別々に設定されています。今回の場合、「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については確認していません。
コピーしてしまったら、今回の趣旨から外れてしまうので。
No.2
- 回答日時:
実質回答者さんがすでに答えてるので、蛇足ですが。
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
が出力されています。
なんとなくですが、何か根本的なことが
間違っているように感じます。
No.1
- 回答日時:
ソリューションエクスプローラーのprojectBのソースファイル上で右クリック。
「追加」「既存の項目」でcommon.cppを選択。
同様に行い、projectBのヘッダファイルにcommon.hを追加。
この回答への補足
ご回答、有難うございます。
common.cpp, common.hをprojectBに追加しました。
しかしながら、リビルドしても
>fatal error C1083: include ファイルを開けません。'common.h': No such file or directory
と出力されて、commonファイルたちを認識してくれません。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
このQ&Aを見た人はこんなQ&Aも見ています
関連するカテゴリからQ&Aを探す
おすすめ情報
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
スタティックライブラリ関係の...
-
C++Builder リンカエラーとは?
-
C言語のPathFileExistsについて
-
error LNK2019: 未解決の外部シ...
-
VC++6.0からVC++.NET2005へ移植
-
スタティックライブラリの使い方
-
スタティックリンクライブラリ...
-
#pragma commentの相対パス指定
-
Visual Studio 2022の『#define...
-
LTspice モデル作成について
-
VisualStudio の規定値が消滅した
-
python エラー
-
エクセルのエラーメッセージ「4...
-
デバッガでステップ実行してい...
-
DLLファイルの逆コンパイラにつ...
-
「fatal error C1189」を回避す...
-
DLL参照時に指定されたモジュー...
-
<unistd.h>をVisualStudioでつ...
-
HANDLEの宣言でのエラー
-
ソフトの開発言語を調べる方法
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
スタティックライブラリ関係の...
-
静的/動的リンクライブラリにつ...
-
#pragma commentの相対パス指定
-
fatal error LNK1104: ファイル...
-
【VS2008 C++】2つのプロジェ...
-
VC++でビルド時の、リンク警告 ...
-
C/C++の.libについて教えてくだ...
-
VS2010にて、依存関係とビルド順
-
C++Builder リンカエラーとは?
-
lvwReport/エラー/プロジェクト...
-
スタティックリンクライブラリ...
-
「MFCを使用しない」から「MFC...
-
Visual Studio 2022の『#define...
-
error LNK2019: 未解決の外部シ...
-
C言語のPathFileExistsについて
-
visual studio community2017 O...
-
C++によるPostgreSQLの接続
-
スタティックライブラリの使い方
-
'stdafx.h'のエラーに関して
-
ライブラリについて
おすすめ情報