• 締切済み

VC++2005であるヘッダファイルを複数のソースから読み込みたいのですが…

毎度お世話になっています。 現在VC++2005でUSBカメラ画像の処理プログラムを作成しているのですが、 現在こちらのEWCLIBというライブラリを利用しています。 http://www.geocities.jp/in_subaru/ewclib/ このライブラリを 一つのソースファイルからから呼び出した場合問題無いのですが、 複数のソースファイルから呼び出した場合error LINK2005 既に~で定義されています… といったエラーが出てしまいます。 複数のソースファイルからこのライブラリを利用したい場合どのようにすればいいでしょうか? このライブラリは #define EWC_BRIGHTNESS 0 … int ewc_init=0; … int ewc_ncam; … int EWC_GetImage(int num, void *buffer){ … } と単一のヘッダファイルに変数や関数の定義を行っているのですが、 複数のソースファイルからこのライブラリを利用したい場合、やはりヘッダとソースに分割する必要があるのでしょうか? 参考になるページや解決方法等、お伺いしたいです。

みんなの回答

  • Tacosan
  • ベストアンサー率23% (3656/15482)
回答No.4

ヘッダには inline 関数以外のものの定義を入れちゃだめです. プリプロセッサ系以外で入れていいのは宣言 (と inline な関数の定義) だけと思っていい. 蛇足ですが, インクルードガードで使うにしても __SAMPLE_H はまずいでしょう>#1. 処理系が内部的に使うシンボルとかぶったときに痛い.

  • phoenix343
  • ベストアンサー率15% (296/1946)
回答No.3

#1です。 |定義がマズいのでしょうか? まずいですね 基本、ヘッダーには プロトタイプ宣言と外部変数の宣言しかいらないはずです。 問題の例で言えば extern int ewc_init; … extern int ewc_ncam; … int EWC_GetImage(int num, void *buffer); という感じでなければいけません。 で実体はヘッダーでなくソースに書くべきものです。 #2 の方と同意見です。

  • Wr5
  • ベストアンサー率53% (2177/4070)
回答No.2

掲示されたライブラリでは… 複数のソースファイルからの参照は考慮されていないようですので、 >やはりヘッダとソースに分割する必要があるのでしょうか? というコトになるかと思われます。 あるいは、このライブラリを使用するソースの方を1つにまとめる…とか。 ヘッダにベタ書きとか、こういうのはライブラリと思いたく無いですねぇ。 もう少し、使用する側のコトを考慮していただきたい。 # まぁ、WinMainとかをでっかいヘッダに隠蔽して、ライブラリという専門学校もありますし。 # さらにdefine定義で隠蔽されていたので…そこで学んだ学生は素のWinSDKプログラミングができるのかどうか……。

  • phoenix343
  • ベストアンサー率15% (296/1946)
回答No.1

その共通ヘッダーに #ifndef __SAMPLE_H #define __SAMPLE_H ;; // 元の羅列 #endif という感じでくくりましょう(__SAMPLE_H、というのはヘッダー固有の文字列でお願いします) こうすれば一度取り込んだヘッダーを再読込みすることがなくなります。 標準ライブラリのヘッダーなどを覗くと分かると思いますが、 大抵ヘッダー固有のマクロ文字列を定義させているものです。 VC++特有の指定 #pragma once なんていうのもあるけど、これは対応していないコンパイラもあるしね、、 ※それにしてもヘッダーに int ewc_init=0; … int ewc_ncam; … こんな定義があるのですか? もしそうなのであればヘッダーとして失格です(笑

co1632143
質問者

お礼

回答ありがとうございます。 すいません、記述していませんでしたが、 このヘッダーには#pragma onceのインクルードガードが付いています。 (#ifndefも試してみましたがやはりerror LINK2005が出ます) 定義がマズいのでしょうか? どのように書き換えれば他の複数のソースから利用できるのでしょうか? ご存知でしたら教えて下さい。

関連するQ&A

  • ヘッダーの多重定義での疑問です。

     Cで開発をしているのですが、ヘッダーファイルでの定義ではたとえば、int a と か double hoge とか定義して、そのヘッダーファイルを複数の cファイルが読み込むと多重定義になりますよね? hoge.h int a; // 多重定義 このヘッダーを複数の.cファイルに読み込む しかし、自分のプロジェクトだと、ヘッダーファイルにint aとかdouble hogeとか 定義してもエラーにならないんです。 ただし、int b = 10;のように代入すると多重エラー また、試しに新しくプロジェクトを作ってヘッダーで定義すると多重定義でエラーでした。

  • C言語のヘッダファイルの使い方

    ヘッダファイルの使い方について質問です。 ソースファイルA、ソースファイルBで共有して使用したい変数がある場合、 Aでは「int a」と宣言し、Bでは「extern int a」と宣言すれば 同じ変数を共有出来ると認識しています。 それをヘッダファイルへ記述しておきたい場合にはどのように 宣言しておけば良いのでしょうか? ヘッダファイルに「int a」と宣言した場合は両方のソースファイルで includeした時に多重定義でエラーとなります。 では「extern int a」と宣言しておいて、両方のソースファイルで includeするのが正しいのでしょうか? 初歩的な質問で申し訳ないですが、有識者の方、教えてください。

  • VC++ includeファイルについて

    VC++2005でグローバル変数を利用したいと考えています。 そこで、kaisu.hというヘッダーファイルにint n=0;と書いてあります。 そこでプログラムでは、 #include "kaisu.h" しているのですが、エラーがどうしても出てしまいます。 エラーは以下の通りなのですがどのようにすれば良いのでしょうか? error LNK2005: "int n" (?n@@$$Q3HA) は既に Form2.obj で定義されています。 場所::試作品.obj エラー 2 fatal error LNK1169: 1 つ以上の複数回定義されているシンボルが見つかりました。

  • VC++でソースファイルに2つのデータを作る場合。

    Microsoft Visual C++ 2008 Express Editionというコンパイラを使っています。 新しいプロジェクトを作成すると、ソースファイル、ヘッダーファイル、リソースファイルの3つのフォルダが作成されます。 ソースファイルのフォルダに.cppのプログラムを作成しています。 もう一つ別のプログラムを実行しようと思って、ソースファイルのフォルダにプログラムを追加して実行すると必ずエラーが出てしまいます。 エラーの内容は「1 つ以上の複数回定義されているシンボルが見つかりました。」のようです。 1つのソースファイルに2つ以上のプログラムは作れないのでしょうか?

  • ソースとヘッダの境界とは?

    C/C++のプログラミングにおいて、これだけは絶対にソースファイル(.c,.cpp)書かなくてはならない!というものはあるのでしょうか? 仕事でプログラミングをしている時に、同僚から「その変数の定義はソースファイルに書かないとダメ」と言われました。 「その変数の定義」とは、メモリの物理アドレスへの割り付けを伴うもので、以下のようなものです。 #pragma section=~, IO=~, attr=~, locate=0xFECA0000 __io int piyo; /* 0xFECA0000 */ __io int hoge; /* 0xFECA0004 */ 特殊なコードで分かりにくく、申し訳ないのですが、簡単に言えば、「locate」で指定した物理アドレスから連続で変数を割り当てていくものです。 このコードをなぜヘッダではなく、「絶対に」ソースファイルに書かなくてはならないのかを尋ねましたが、明確な回答は得られませんでした。 私の認識としては、ソースファイルにAという処理を書くことと、Aの処理を書いたヘッダファイルをincludeすることとは、コンパイラにとっては全く同じことだと思ってます。 試しに、以下のソースを書いた「ヘッダ」ファイル”test.h”と「#include "test.h"」とだけ書いたソースファイル”test.c”を作成してビルドしたら、ちゃんと動く実行ファイルができました。 #include <stdio.h> int main(void) { printf( "Hello, World!\n" ); return 0; } 今回ご回答頂きたいのは、上記の物理アドレス割り付けのコードについてではなく、一般的な話として、これは「絶対に」ソースファイルに書かなきゃいけない!それは「絶対に」ヘッダファイルに書かなきゃいけない!とか言うものがあるのかどうか。あるとすれば、具体的にどのようなものなのかと言うことです。 何卒よろしくお願いいたします。

  • ヘッダファイルの2重のインクルードについて

    ある書物に「ヘッダファイルを複数回インクルードすると、それを”再定義”することによるエラーになる」と書いてありますたが、以下のようなヘッダファイルを作りそれを数回インクルードしても何ら異状が無くコンパイルできました。 math.h→ヘッダファイル名 #define max(a,b)  ((a)>(b)?(a):(b))→ヘッダファイルの内容 c ファイル #include<stdio.h> #include"math.h"←複数回インクルード #include"math.h"←複数回インクルード int main(void){ int x=1,y=2; printf("max(x,y)=%d\n",max(x,y)); return 0; } 環境としては、RedHat Linuxでviです。 何ゆえ、エラーにならないのか良く解りません。 宜しくお願いします。

  • VC++2010の「#include <」

    VC++ で、他人の作ったソースコードをビルドして実行してみています。 (WinPcapのデベロッパ向けのライブラリを使った、サンプルプログラムです。) VC++自体、あまり理解が深くないのですが、 「#include <」まで書くと、「ヘッダファイル名が表示される」プロジェクトと、「そうではない」プロジェクトがあります。 「そうではない」方のプロジェクトだと、ビルド時にincludeするライブラリが足りないとか、そんな感じのエラーが表示されます。 ぱっと見の違いは、「ヘッダファイル名が表示される」プロジェクトの場合は、 ソリューションエクスプローラに、「外部依存関係」というフォルダのショートカットがあり、ライブラリがどっさりあります。 「そうではない」プロジェクトについても、「#include <」で、ヘッダファイルを表示してくれるようにしたいのですが、どの様にすればよいのでしょうか?★ プロジェクトのプロパティの、 C++>プリプロセッサ>プリプロセッサの定義 リンカー>入力>追加の依存ファイル はどちらのソースも同じにしたのですが…。

  • ソースとヘッダについて

    VC++2008を使っています。これは他でもいえるのではないかと思いますが、一応プロジェクトの種類はWindowsFormアプリケーションです。 字数削減や書きなおしを楽にするために、ある程度のマクロを織り交ぜたコーディングをしたいのですが ソースに#defineしたものの効果範囲は、#undefの場所まで あるいはそれがなければそのソースの終了地点まで でしょうか? もしそうなら、ソースに書く分なら「別のソースに同じマクロを、全く違う定義をして使っても問題ない」という事でしょうか? ヘッダに書いた場合は、なんか#undef文を下の方に書いてもまるで上に書いたかのように「駄目」という判定になってしまったのですが、かといって#undefを書かないとそのヘッダをインクルードする他のヘッダにも影響を与えてしまうようで… これをどうにかできる方法はありませんか? また、ソースでは #pragma once などをしなくてもいいのですか? (あるいは書いてもソースはオブジェクトファイルに変換され、実質的にはコンパイル後に影響が出るため、プリプロセッサはコンパイル前に完了するので、ソースにこれを書いたところで無意味ということでしょうか?)

  • ソースの分け方がよく分かりません

    ソースの量が増えてきたので分けることにしました。 ・メインのソース ・クラスの定義のヘッダ(1),(2) ・クラスのメンバ関数の定義用のソース(1)、(2) このように3種類の構成にしています。 そして、クラス(1)の実体は次のように配列の形で作ります。 int aaa[] = {1,2,3}; const int Num = (sizeof aaa /sizeof aaa[0]); static DATA data[Num]; しかし、上記のコードをどこに書けば良いか分からず、とりあえずクラス(1)のソース内に書いたんですが、クラス(2)のヘッダとソース内でもNumを使うため、このままではNumが定義されていないというエラーになります。一体どのように書くべきでしょうか。よろしくお願いいたします。

  • VC2005のDLLを6.0で呼び出すには

    VC 2005 Pro Editionで作ったライブラリ(ヘッダ、lib、dll)を頂きました。    頂いたDLLの形式は定義ファイル.defを使わない形式、declspec(dllexport)を使う形式の方です。  呼び出し側はVC6.0EnterPrize(SDK)を使います。 (諸事情により6.0以上にUPすることは不可能)     まず、静的リンクをし、関数を呼び出してみました。  (設定のリンクよりlibをリンクさせ、ヘッダをインクルードして)  すると以下のメッセージが出てしまいます。 リンク中... Dialog1.obj : error LNK2001: 外部シンボル ""__declspec(dllimport) void __cdecl Init(unsigned char *,unsigned char *,unsigned char *,unsigned char *)" (__imp_?Init_Card@@YAXPAE000@Z)" は未解決です Debug/CardMake.exe : fatal error LNK1120: 外部参照 1 が未解決です 。 link.exe の実行エラー    色々やってみましたが、このエラーから回避できませんでした。  ヘッダ自体に #ifdef _USRDLL #define DLL_PORT __declspec(dllexport) #else #define DLL_PORT __declspec(dllimport) #endif    の宣言があるので、別に特別なことをしなくても、大丈夫そうなのですが、何故か出来ません。  次に動的リンクを行っていました。  するとLoadLibraryでエラーになり、GetLastErrrorで14001(エラーメッセージはつかめず)が返ってきました。 (色々調べたところ定義ファイルがないと動的リンクはできないようですね)    というわけでにっちもさっちも行かなくなった状況です。  そこでご質問です。 (1)定義ファイルを使わない形式のライブラリ(暗示的に定義されているもの)はどのように呼び出させばよいでしょうか? (2)2005のライブラリを6.0から呼び出すことは可能ですか?  また呼び出す方法は?  すいませんがご回答をお願いします。

専門家に質問してみよう