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も見ています
-
新NISA制度は今までと何が変わる?非課税枠の拡大や投資対象の変更などを解説!
少額から投資を行う人のための非課税制度であるNISAが、2024年に改正される。おすすめの銘柄や投資額の目安について教えてもらった。
-
1 つ以上の複数回定義されているシンボルが見つかりました
C言語・C++・C#
-
C++コンパイル時に『 C1083: include ファイルを開けません。』を表示
C言語・C++・C#
-
cout関数を使っているのですが,画面に出力されません。
C言語・C++・C#
-
-
4
char*を初期化したいのですが
C言語・C++・C#
-
5
画面を強制的に再描画させる方法
C言語・C++・C#
-
6
typedef enumの使い方を教えてください
C言語・C++・C#
-
7
既定のコンストラクタがない?
C言語・C++・C#
-
8
<unistd.h>をVisualStudioでつかえるようにする
C言語・C++・C#
-
9
std::stringからLPCWSTR型への変換
C言語・C++・C#
-
10
error C2664: 'LPCTSTR' に変換できません。
C言語・C++・C#
-
11
c++,ある関数のクラスから別のクラスの関数を呼ぶ
C言語・C++・C#
-
12
#define _CRT_SECURE_NO_WARNINGS について
C言語・C++・C#
関連するカテゴリからQ&Aを探す
おすすめ情報
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
ハンドルされていない例外が発...
-
2重定義って??
-
long型の定数の末尾にLを付ける...
-
プログラムの中で別のmainを呼...
-
DWORDの実際の型は何でしょうか
-
int void (main)の意味・・・
-
C++のfor文について
-
コンパイルすると error C1083 ...
-
DDVによるメッセージの変更
-
C言語 宣言した変数になにも代...
-
main.c:7:43: warning: implici...
-
構造体の宣言でエラーが出ます。
-
enumについて
-
main()とint main(void)の違い
-
LNK2019: 未解決の外部シンボル...
-
変数の型を定義しなかった場合...
-
構造体の要素すべてに対する四...
-
VB 関数
-
【#define】 defineで定義した...
-
C言語のreturnの使い方
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
DWORDの実際の型は何でしょうか
-
visualstudio C# テキストボッ...
-
2重定義って??
-
long型の定数の末尾にLを付ける...
-
C++のfor文について
-
typedef enumの使い方を教えて...
-
関数の実体定義にヘッダファイ...
-
変数の型を定義しなかった場合...
-
ハンドルされていない例外が発...
-
C++でboolにintの値を代入する...
-
main.c:7:43: warning: implici...
-
プログラムの中で別のmainを呼...
-
【#define】 defineで定義した...
-
void func( void )について
-
構造体の要素すべてに対する四...
-
構造体の宣言でエラーが出ます。
-
C++の(左辺値)参照を参照渡し
-
main()とint main(void)の違い
-
intとINTの違いは?
-
DLLでLIBファイルが作成されない
おすすめ情報