![](http://oshiete.xgoo.jp/images/v2/pc/qa/question_title.png?e8efa67)
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で質問しましょう!
このQ&Aを見た人はこんなQ&Aも見ています
-
「これはヤバかったな」という遅刻エピソード
寝坊だったり、不測の事態だったり、いずれにしても遅刻の思い出はいつ思い出しても冷や汗をかいてしまいますよね。特にものすごく怒られたときとか、とんでもない損害を与えてしまったときとか…。
-
char*を初期化したいのですが
C言語・C++・C#
-
C#で構造体の配列を持った構造体を使いたいのですが
C言語・C++・C#
-
<unistd.h>をVisualStudioでつかえるようにする
C言語・C++・C#
-
-
4
「fatal error C1189」を回避するには?
C言語・C++・C#
-
5
C++コンパイル時に『 C1083: include ファイルを開けません。』を表示
C言語・C++・C#
-
6
VisualStudio2019のコードアナライザでC6386(バッファオーバーラン)エラー
C言語・C++・C#
関連するカテゴリからQ&Aを探す
おすすめ情報
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
DWORDの実際の型は何でしょうか
-
long型の定数の末尾にLを付ける...
-
構造体の要素すべてに対する四...
-
C++のfor文について
-
ハンドルされていない例外が発...
-
GCCで暗黙の型変換の警告を出し...
-
変数の型を定義しなかった場合...
-
間違っていないような気がする...
-
C++でboolにintの値を代入する...
-
main()とint main(void)の違い
-
64bit → 32bit型へのキャスト
-
C言語 宣言した変数になにも代...
-
構造体を生成時にわざわざ初期...
-
typedef enumの使い方を教えて...
-
プログラムの中で別のmainを呼...
-
構造体メンバへの代入
-
関数の実体定義にヘッダファイ...
-
main.c:7:43: warning: implici...
-
CStringを含むconst構造体
-
C++のコンストラクタを宣言する...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
DWORDの実際の型は何でしょうか
-
long型の定数の末尾にLを付ける...
-
2重定義って??
-
C++のfor文について
-
visualstudio C# テキストボッ...
-
typedef enumの使い方を教えて...
-
C++でboolにintの値を代入する...
-
構造体の要素すべてに対する四...
-
main.c:7:43: warning: implici...
-
変数の型を定義しなかった場合...
-
intとINTの違いは?
-
ハンドルされていない例外が発...
-
構造体の宣言でエラーが出ます。
-
プログラムの中で別のmainを呼...
-
関数の実体定義にヘッダファイ...
-
【#define】 defineで定義した...
-
C++ クラスをメンバにもつクラ...
-
VC6でlong longでエラー?
-
void func( void )について
-
エラー「invalid conversion fr...
おすすめ情報