dポイントプレゼントキャンペーン実施中!

毎度お世話になっています。
現在VC++2005でUSBカメラ画像の処理プログラムを作成しているのですが、
現在こちらのEWCLIBというライブラリを利用しています。
http://www.geocities.jp/in_subaru/ewclib/

このライブラリを
一つのソースファイルからから呼び出した場合問題無いのですが、
複数のソースファイルから呼び出した場合error LINK2005 既に~で定義されています…
といったエラーが出てしまいます。
複数のソースファイルからこのライブラリを利用したい場合どのようにすればいいでしょうか?

このライブラリは
#define EWC_BRIGHTNESS0 …
int ewc_init=0; …
int ewc_ncam; …
int EWC_GetImage(int num, void *buffer){ … }
と単一のヘッダファイルに変数や関数の定義を行っているのですが、
複数のソースファイルからこのライブラリを利用したい場合、やはりヘッダとソースに分割する必要があるのでしょうか?

参考になるページや解決方法等、お伺いしたいです。

A 回答 (4件)

ヘッダには inline 関数以外のものの定義を入れちゃだめです. プリプロセッサ系以外で入れていいのは宣言 (と inline な関数の定義) だけと思っていい.


蛇足ですが, インクルードガードで使うにしても
__SAMPLE_H
はまずいでしょう>#1. 処理系が内部的に使うシンボルとかぶったときに痛い.
    • good
    • 0

#1です。



|定義がマズいのでしょうか?
まずいですね

基本、ヘッダーには
プロトタイプ宣言と外部変数の宣言しかいらないはずです。
問題の例で言えば
extern int ewc_init; …
extern int ewc_ncam; …
int EWC_GetImage(int num, void *buffer);
という感じでなければいけません。

で実体はヘッダーでなくソースに書くべきものです。
#2 の方と同意見です。
    • good
    • 0

掲示されたライブラリでは…


複数のソースファイルからの参照は考慮されていないようですので、
>やはりヘッダとソースに分割する必要があるのでしょうか?
というコトになるかと思われます。

あるいは、このライブラリを使用するソースの方を1つにまとめる…とか。

ヘッダにベタ書きとか、こういうのはライブラリと思いたく無いですねぇ。
もう少し、使用する側のコトを考慮していただきたい。
# まぁ、WinMainとかをでっかいヘッダに隠蔽して、ライブラリという専門学校もありますし。
# さらにdefine定義で隠蔽されていたので…そこで学んだ学生は素のWinSDKプログラミングができるのかどうか……。
    • good
    • 0

その共通ヘッダーに



#ifndef __SAMPLE_H
#define __SAMPLE_H

;; // 元の羅列

#endif

という感じでくくりましょう(__SAMPLE_H、というのはヘッダー固有の文字列でお願いします)
こうすれば一度取り込んだヘッダーを再読込みすることがなくなります。

標準ライブラリのヘッダーなどを覗くと分かると思いますが、
大抵ヘッダー固有のマクロ文字列を定義させているものです。

VC++特有の指定
#pragma once
なんていうのもあるけど、これは対応していないコンパイラもあるしね、、

※それにしてもヘッダーに
int ewc_init=0; …
int ewc_ncam; …
こんな定義があるのですか?
もしそうなのであればヘッダーとして失格です(笑
    • good
    • 0
この回答へのお礼

回答ありがとうございます。
すいません、記述していませんでしたが、
このヘッダーには#pragma onceのインクルードガードが付いています。
(#ifndefも試してみましたがやはりerror LINK2005が出ます)

定義がマズいのでしょうか?
どのように書き換えれば他の複数のソースから利用できるのでしょうか?
ご存知でしたら教えて下さい。

お礼日時:2009/07/19 20:32

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