![](http://oshiete.xgoo.jp/images/v2/pc/qa/question_title.png?8acaa2e)
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を追記してみましたがダメでした。
No.1ベストアンサー
- 回答日時:
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{
・・・
}
としてください。
sha-girlさん、画像処理のときはお世話になりました。
問題はcommon.cをincludeするのではなく、
common.cをコンパイルして1つのobjとすることで解決しました。
(それ以外にもう一点クリアする問題があって大変でした)
その過程でsha-gielさんの勧告に従いまして
ヘッダーファイルに型宣言をすることに致しました。
どうもありがとうございました。
No.3
- 回答日時:
#2の回答に横から補足
なんとなくグローバル変数もあるような気がする
関数をstaticにする(内部結合にする)場合、変数も共有したくないハズなので、グローバル変数もstaticにして(ファイルグローバル変数にして)ください。
No.2
- 回答日時:
既に回答にあるように、プロトタイプだけを切り出したヘッダを用意するのが正攻法です。
他の方法としては、
・関数にstaticを付けて内部結合にする。
・マクロにする。
・インライン関数にする。(Cの場合は移植性がなくなる)
・テンプレートにする。(C++のみ)
・無名名前空間を使う。(C++のみ)
といった方法があります。
どうしても関数の実体が2つ必要な場合は、staticを付けるか無名名前空間にするのが一番無難です。
色々と方法論を挙げて頂き、感謝します。
今回は共通で使う関数の実体は1つにしたいけれど、
EXPORTする関数が2つある場合にどうしたらよいのかでした。
#1に具体的な解決策を書いておきました。
お探しの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/10 16:15
- C言語・C++・C# C言語 3 2022/10/04 15:07
- C言語・C++・C# C言語プログラム変更 2 2022/12/21 15:03
- C言語・C++・C# win10で、正確な待ち時間の作り方 6 2023/02/14 18:28
- C言語・C++・C# カードシャッフルのブログラムを使ってc言語でブラックジャックをしたい 2 2022/04/12 15:13
- 大学・短大 C言語線形リストの問題です 3 2022/12/22 00:45
- その他(プログラミング・Web制作) pythonのプログラムについての質問です。 1 2023/05/26 10:31
- C言語・C++・C# このプログラミングの問題を教えて欲しいです。 キーボードから整数kを入力し、kが配列aの中に何個存在 2 2022/12/19 22:50
- C言語・C++・C# メインプログラムに#include <algorithm>を書いて、 そのメインプログラムが // 3 2023/05/02 11:24
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
既定のコンストラクタがありま...
-
【gcc・cygwin】multiple defin...
-
C言語 ① 5秒間 1秒間隔で点滅を...
-
戻り値を返す関数の前に(void)...
-
ウインドウの移動禁止
-
C++でイベントドリブンなコード...
-
C# Controls.Addで動的に配置し...
-
参照型を格納できるコンテナに...
-
関数名の名前の衝突について。
-
C#を勉強中でC#で壁紙を変更す...
-
多重定義が起きている?--lnk20...
-
C++にてtemplateで受け取った任...
-
派生クラスの自動生成
-
Arduinoを使ってMIDI機器のコン...
-
CreateThreadのエラー
-
const_castのつかいどころを教...
-
gcc: incompatible pointer type
-
関数ポインタについて
-
構造体を宣言と共に初期化する方法
-
クラス間でのクラスの共有?
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
既定のコンストラクタがありま...
-
【gcc・cygwin】multiple defin...
-
戻り値を返す関数の前に(void)...
-
C++にてtemplateで受け取った任...
-
多重定義が起きている?--lnk20...
-
gcc: incompatible pointer type
-
静的でないメンバ関数の呼び出...
-
int main()、void main()、void...
-
Notepad++の関数リスト表示の変...
-
C# KeyDownイベントでショート...
-
C# Controls.Addで動的に配置し...
-
(void)0 はどんな意味ですか
-
ArduinoでMouse関数を使用して...
-
DLLの関数呼び出しで引数がある...
-
void*型の配列について
-
ウインドウの移動禁止
-
const_castのつかいどころを教...
-
VC++でGetKeyboardStateがうま...
-
C言語 プロトタイプ宣言
-
stddef.hって何?
おすすめ情報