![](http://oshiete.xgoo.jp/images/v2/pc/qa/question_title.png?5a7ff87)
DLLを作るプログラムをしているのですが、どうしてもコンパイル時にLIBファイルが作成されません。
1>warning C4091: '__declspec(dllexport)' : 変数が何も宣言されていないときは、'DDDClass' の左辺を無視します。
と警告が出てしまいます。
私が書いたソースは以下の通りで、クラスとそのメンバをEXPORTしたいのです。ここで、最後のコメントを外して有効にするとLIBファイルが作成されることはわかっています。また、クラスのメンバにEXPORTをつけてもオーバーライトだと怒られてしまいます。
どのようにしたらLIBファイルが作成されるようになるのでしょうか?
■■■stub.h■■■
#ifdef __cplusplus
#define EXPORT extern "C" __declspec (dllexport)
#else
#define EXPORT __declspec (dllexport)
#endif
typedef int (*HOGEHOGE)(int i);
EXPORT class DDDClass{
private:
int num;
HOGEHOGE c;
public:
DDDClass();
int CALLBACK counter();
int CALLBACK touroku(int (*b)(int i));
};
■■■stub.cpp■■■
#include <windows.h>
#include "Stub1.h"
int WINAPI DllMain(HINSTANCE hInstance, DWORD fdwReason, PVOID pvReserved){
return true;
}
EXPORT class DDDClass;
DDDClass::DDDClass(){
num =0;
c = NULL;
}
int CALLBACK DDDClass::touroku(int (*b)(int i)){
c = b;
return 0;
}
int CALLBACK DDDClass::counter(){
//c = b;
c(num);
num++;
return 0;
}
/*
EXPORT bool CALLBACK aaaaa(){
return true;
}
*/
No.1ベストアンサー
- 回答日時:
__declspecの挿入位置が悪いのだと思います
class __declspec(dllexport) クラス名 {
// クラス定義の内容
};
といった具合に classとクラス名の間に __declspecが無いといけません
リンケージ指定の extern "C"は classより前にある必要があります
ですから EXPORTのみで両方をマクロ定義するのはちょっと無理がありそうです
それとstub.cppの
> EXPORT class DDDClass;
これは どんな意図でしょう クラスのインスタンスをエクスポートしたいのならオブジェクト名が必要だと思います
この回答への補足
回答ありがとうございます。
class __declspec(dllexport) DDDClass{
でLIBファイルが作成されることまで確認できました。
ありがとうございます。
一方、
class extern "C" __declspec(dllexport) DDDClass{
ですと、エラーが大量にでてしまいます。
こちらの書き方はなにがまずいのでしょうか?
すみません。
先ほどの補足では
extern "C" class __declspec(dllexport) DDDClass{
であることを見落としていました。
この書き方で解決しました。
また、
EXPORT class DDDClass;
はどうしてもLIBができないので試しに書いてみたのですが、おっしゃるとおりオブジェクトが必要ですね。
ありがとうございました。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- C言語・C++・C# c言語の問題の説明、各所ごとに 5 2023/07/26 11:03
- C言語・C++・C# C++プログラミングコードにポリモーフィズムを取り入れ方を教えてください。 2 2023/06/09 11:17
- C言語・C++・C# c言語の問題です 3 2023/01/10 16:15
- C言語・C++・C# C言語でif文が予想と違う動きをする件について7 4 2023/03/20 00:26
- C言語・C++・C# このプログラミング誰か教えてくれませんか 1 2022/06/02 15:27
- C言語・C++・C# C言語プログラム変更 2 2022/12/21 15:03
- C言語・C++・C# C pointer? or... 2 2022/03/29 00:47
- C言語・C++・C# 質問です 下記のコードを分かりやすく解説お願いします 初心者です #include ‹stdio.h 3 2022/05/26 22:03
- C言語・C++・C# C言語の課題が出たのですが自力でやっても分かりませんでした。 要素数がnであるint型の配列v2の並 3 2022/11/19 17:41
- C言語・C++・C# c言語 プログラムのエラー 1 2023/02/11 20:31
このQ&Aを見た人はこんなQ&Aも見ています
-
賃貸で可能な古民家風レトロな部屋作りのコツ!改めて知る畳の高い機能性と魅力も紹介
畳の部屋を雰囲気のよい部屋に仕上げたい!賃貸住宅でもできる古民家風のレトロな部屋作りのコツを伺った。
-
画面を強制的に再描画させる方法
C言語・C++・C#
-
char*を初期化したいのですが
C言語・C++・C#
-
<unistd.h>をVisualStudioでつかえるようにする
C言語・C++・C#
-
-
4
「fatal error C1189」を回避するには?
C言語・C++・C#
-
5
std::stringからLPCWSTR型への変換
C言語・C++・C#
-
6
C++コンパイル時に『 C1083: include ファイルを開けません。』を表示
C言語・C++・C#
-
7
CStringからchar*への型変換について教えてください。
C言語・C++・C#
-
8
任意のディレクトリ以下に存在するファイル数について
C言語・C++・C#
-
9
C#で構造体の配列を持った構造体を使いたいのですが
C言語・C++・C#
-
10
1 つ以上の複数回定義されているシンボルが見つかりました
C言語・C++・C#
-
11
既定のコンストラクタがない?
C言語・C++・C#
-
12
多重定義が起きている?--lnk2005エラー:VC++
C言語・C++・C#
-
13
VisualStudio2019のコードアナライザでC6386(バッファオーバーラン)エラー
C言語・C++・C#
関連するカテゴリからQ&Aを探す
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
DWORDの実際の型は何でしょうか
-
long型の定数の末尾にLを付ける...
-
2重定義って??
-
typedef enumの使い方を教えて...
-
変数の型を定義しなかった場合...
-
【#define】 defineで定義した...
-
DDVによるメッセージの変更
-
0除算を判定したい
-
C#でオセロを作っているのです...
-
intとINTの違いは?
-
C言語での方向キー入力判定
-
関数の実体定義にヘッダファイ...
-
64bit → 32bit型へのキャスト
-
C言語で分割ファイル先の関数を...
-
visualstudio C# テキストボッ...
-
エラー「invalid conversion fr...
-
C言語でのフィボナッチ数列の表示
-
enumについて
-
直接アドレス指定のポインタの...
-
構造体の要素すべてに対する四...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
DWORDの実際の型は何でしょうか
-
long型の定数の末尾にLを付ける...
-
2重定義って??
-
typedef enumの使い方を教えて...
-
visualstudio C# テキストボッ...
-
C++のfor文について
-
関数の実体定義にヘッダファイ...
-
構造体の要素すべてに対する四...
-
ハンドルされていない例外が発...
-
C++でboolにintの値を代入する...
-
変数の型を定義しなかった場合...
-
intとINTの違いは?
-
main.c:7:43: warning: implici...
-
void func( void )について
-
C言語 宣言した変数になにも代...
-
【#define】 defineで定義した...
-
構造体の宣言でエラーが出ます。
-
C言語での方向キー入力判定
-
プログラムの中で別のmainを呼...
-
C言語について質問です。 子プ...
おすすめ情報