電子書籍の厳選無料作品が豊富!

VCで1つのDLL内に2つの関数を持つDLLを作成しています。
簡単に書きますと次のようなコードになっています

プログラムA
#include "common.c"
void abc{
・・・
}

プログラムB
#include "common.c"
void def{
・・・
}

これでビルドするとコンパイルは通りますが
リンクのときに同じ関数名が2つ存在するという旨のエラーになります。

common.cの中にある関数がabeとdefの両方で使われているときだけ発生しますので
エラーの原因は明らかなのですが、この回避方法が分かりません。

気休めにプログラムBの#includeを外してみたり(コンパイルエラーになります)
common.cに#pragma onceを追記してみましたがダメでした。

A 回答 (3件)

common.hの内容


#pragma once
void funccommon();


common.cの内容
void funccommon(){
printf("test");
}


プログラムA a.cの内容
#include "common.h"
void abc{
・・・
}


プログラムB b.cの内容
#include "common.h"
void def{
・・・
}

としてください。
    • good
    • 0
この回答へのお礼

sha-girlさん、画像処理のときはお世話になりました。

問題はcommon.cをincludeするのではなく、
common.cをコンパイルして1つのobjとすることで解決しました。
(それ以外にもう一点クリアする問題があって大変でした)

その過程でsha-gielさんの勧告に従いまして
ヘッダーファイルに型宣言をすることに致しました。

どうもありがとうございました。

お礼日時:2005/10/01 04:29

#2の回答に横から補足



なんとなくグローバル変数もあるような気がする

関数をstaticにする(内部結合にする)場合、変数も共有したくないハズなので、グローバル変数もstaticにして(ファイルグローバル変数にして)ください。
    • good
    • 0

既に回答にあるように、プロトタイプだけを切り出したヘッダを用意するのが正攻法です。



他の方法としては、

・関数にstaticを付けて内部結合にする。
・マクロにする。
・インライン関数にする。(Cの場合は移植性がなくなる)
・テンプレートにする。(C++のみ)
・無名名前空間を使う。(C++のみ)

といった方法があります。
どうしても関数の実体が2つ必要な場合は、staticを付けるか無名名前空間にするのが一番無難です。
    • good
    • 0
この回答へのお礼

色々と方法論を挙げて頂き、感謝します。

今回は共通で使う関数の実体は1つにしたいけれど、
EXPORTする関数が2つある場合にどうしたらよいのかでした。

#1に具体的な解決策を書いておきました。

お礼日時:2005/10/01 04:35

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