
【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で質問しましょう!
似たような質問が見つかりました
- C言語・C++・C# const char** p;のとき、free(p)でC4090エラーとなるのはなぜですか 3 2023/03/31 16:28
- C言語・C++・C# c言語でユーザ関数を利用して複素数のべき乗と絶対値の数列を計算するプログラムが作りたいです。 3 2023/01/29 22:13
- C言語・C++・C# 至急教えてください! プログラミングの問題です! お願いします! 出力2と全く同じ出力をするように、 2 2022/06/22 23:10
- C言語・C++・C# 至急教えてください!プログラミングの問題です。 割られる整数と割る整数を受け取って、商と余りを出力す 3 2022/07/05 10:23
- C言語・C++・C# バイナリファイルをコピーするのにかかる時間を測りたいのですが実行するとFatel error:gli 2 2022/11/03 01:10
- C言語・C++・C# c言語でユーザ関数を利用して入力された文字列を反転させるプログラムを作りたいです。 3 2023/01/29 19:47
- C言語・C++・C# カードシャッフルのブログラムを使ってc言語でブラックジャックをしたい 2 2022/04/12 15:13
- C言語・C++・C# プログラミング実行後の表示される値を答えよ #include<stdio.h> void main( 7 2022/05/20 00:07
- C言語・C++・C# c言語の問題です 課題1 (二分探索木とセット) 大きさ size の配列 array を考える。す 2 2023/01/10 21:08
- C言語・C++・C# 宣言する関数の形が決まっている状態で、 str1とstr2の文字列をこの順に引っ付けてstrに保存し 2 2022/05/30 18:21
このQ&Aを見た人はこんなQ&Aも見ています
-
外部シンボル ~~"は未解決ですというエラーが直らない"
C言語・C++・C#
-
同じソリューション内の別のプロジェクトのメソッド呼び出し
C言語・C++・C#
-
複数のクラスで共通した関数を使いたい場合
C言語・C++・C#
-
-
4
他の.CPPファイルに定義した関数を呼び出す方法について
C言語・C++・C#
-
5
std::stringからLPCWSTR型への変換
C言語・C++・C#
-
6
c++,ある関数のクラスから別のクラスの関数を呼ぶ
C言語・C++・C#
-
7
DWORDって
C言語・C++・C#
-
8
VB.net 任意の例外を発生させるには・・・
Visual Basic(VBA)
-
9
<unistd.h>をVisualStudioでつかえるようにする
C言語・C++・C#
-
10
CString から LPCTSTRの型に変換
C言語・C++・C#
関連するカテゴリからQ&Aを探す
おすすめ情報
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
スタティックライブラリ関係の...
-
VC++6.0からVC++.NET2005へ移植
-
exeファイルはどのdllを参照す...
-
LTspice モデル作成について
-
フリーでBCCでコンパイルすると...
-
VC++でビルド時の、リンク警告 ...
-
'stdafx.h'のエラーに関して
-
C++Builder リンカエラーとは?
-
スタティックライブラリの使い方
-
DirextXエラー:ファイル'dxerr9...
-
アセンブリプログラムでシェル...
-
DSOUND.LIBが見つかりませんっ...
-
error LNK2019: 未解決の外部シ...
-
Makefileと共有ライブラリ
-
python エラー
-
<unistd.h>をVisualStudioでつ...
-
エクセルのエラーメッセージ「4...
-
” OS ビルド ” の意味が分か...
-
コンパイルできません。
-
VBAを何回も作り直して、容量が...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
スタティックリンクライブラリ...
-
スタティックライブラリ関係の...
-
C++Builder リンカエラーとは?
-
visual studio community2017 O...
-
【VS2008 C++】2つのプロジェ...
-
fatal error LNK1104: ファイル...
-
「MFCを使用しない」から「MFC...
-
#pragma commentの相対パス指定
-
静的/動的リンクライブラリにつ...
-
C/C++の.libについて教えてくだ...
-
VS2010にて、依存関係とビルド順
-
C++によるPostgreSQLの接続
-
WindowsにおけるPostgreSQL+C言...
-
'stdafx.h'のエラーに関して
-
C言語のPathFileExistsについて
-
eclipse+MinGWの環境で外部ライ...
-
VC++でビルド時の、リンク警告 ...
-
exeファイルはどのdllを参照す...
-
error LNK2001: 外部シンボル "...
-
#include <winreg.h>をインクル...
おすすめ情報