C++ dll 定义静态成员
C++ dll define static member
我正在向DLL迈出第一步,我正在尝试为链表编写一个类并将其导出到.dll。当我尝试定义静态成员时,出现编译错误:
[错误] dllimport'd 类的静态数据成员 'dll::Container::IDcount' 的定义
这是我的代码:
容器.h
#ifndef _CONTAINER_H_
#define _CONTAINER_H_
#if BUILDING_DLL
#define DLLIMPORT __declspec(dllexport)
#else
#define DLLIMPORT __declspec(dllimport)
#endif
#define DEFAULT_SIZE 8
namespace dll{
typedef union{
char _c;
short _s;
int _i;
long _l;
float _f;
double _d;
}unit_t;
typedef unsigned long long size_t;
class DLLIMPORT Container{
private:
static size_t IDcount;
unit_t* data;
size_t size;
size_t bytes;
size_t memberID;
Container *next;
Container *prev;
public:
Container();
Container(size_t size);
Container(const Container ©);
~Container();
};
}
#endif
容器.cpp
#include "container.h"
namespace dll{
size_t Container::IDcount = 0;
Container::Container(){
this->memberID = 0;
this->size = DEFAULT_SIZE;
this->bytes = DEFAULT_SIZE * sizeof(unit_t);
this->data = new unit_t[DEFAULT_SIZE];
for(size_t i = 0; i < DEFAULT_SIZE; i++)
this->data[i] = {0x0};
this->next = nullptr;
this->prev = nullptr;
}
Container::Container(size_t size)
: size(size){
this->memberID = 0;
this->bytes = this->size * sizeof(unit_t);
this->data = new unit_t[this->size];
for(size_t i = 0; i < this->size; i++)
this->data[i] = {0x0};
this->next = nullptr;
this->prev = nullptr;
}
Container::Container(const Container ©){
this->memberID = copy.memberID;
this->size = copy.size;
this->bytes = copy.bytes;
this->data = new unit_t[this->size];
for(size_t i = 0; i < this->size; i++)
this->data[i] = copy.data[i];
this->next = copy.next;
this->prev = copy.prev;
}
Container::~Container(){
for(size_t i = 0; i < this->size; i++)
this->data[i]= {0x0};
delete[] this->data;
this->memberID = 0x0;
this->size = 0x0;
this->bytes = 0x0;
if(!(this->prev))
this->prev->next = this->next;
if(!(this->next))
this->next->prev = this->prev;
this->next = nullptr;
this->prev = nullptr;
}
}
我错过了什么吗?
提前致谢
BUILDING_DLL
宏定义不会进入编译器(即使由Dev-C++按照定义显示(。下面是一个小示例,它将文件(无需更改(从cmdline构建到.dll中(您可以忽略最后一部分,因为它是一个测试,以查看它是否也使用VStudio构建(。
输出:
e:WorkDevStackOverflowq050979671>set PATH=%PATH%;c:Installx64MinGW32MinGW327.2.0-posix-seh-rt_v5-rev1mingw64bin e:WorkDevStackOverflowq050979671>dir /b build.bat container.cpp container.h e:WorkDevStackOverflowq050979671>g++ -shared -fPIC -DBUILDING_DLL=1 -std=c++11 -o container_g++.dll container.cpp e:WorkDevStackOverflowq050979671>dir /b build.bat container.cpp container.h container_g++.dll e:WorkDevStackOverflowq050979671>rem NOTE: "container_g++.dll" WAS CREATED e:WorkDevStackOverflowq050979671>rem Building WITHOUT `-DBUILDING_DLL=1` e:WorkDevStackOverflowq050979671>g++ -shared -fPIC -std=c++11 -o container_g++.dll container.cpp container.cpp:5:20: warning: 'dll::Container::IDcount' redeclared without dllimport attribute: previous dllimport ignored [-Wattributes] size_t Container::IDcount = 0; ^~~~~~~ container.cpp:7:2: warning: 'dll::Container::Container()' redeclared without dllimport attribute: previous dllimport ignored [-Wattributes] Container::Container(){ ^~~~~~~~~ container.cpp:18:2: warning: 'dll::Container::Container(dll::size_t)' redeclared without dllimport attribute: previous dllimport ignored [-Wattributes] Container::Container(size_t size) ^~~~~~~~~ container.cpp:29:2: warning: 'dll::Container::Container(const dll::Container&)' redeclared without dllimport attribute: previous dllimport ignored [-Wattributes] Container::Container(const Container ©){ ^~~~~~~~~ container.cpp:40:2: warning: 'dll::Container::~Container()' redeclared without dllimport attribute: previous dllimport ignored [-Wattributes] Container::~Container(){ ^~~~~~~~~ container.cpp:5:9: error: definition of static data member 'dll::Container::IDcount' of dllimport'd class size_t Container::IDcount = 0; ^~~~~~~~~ e:WorkDevStackOverflowq050979671>"c:Installx86MicrosoftVisual Studio Community2015vcvcvarsall.bat" amd64 e:WorkDevStackOverflowq050979671>cl /DBUILDING_DLL=1 container.cpp /MD /Focontainer_msvc.obj /link /dll /out:container_msvc.dll Microsoft (R) C/C++ Optimizing Compiler Version 19.00.24215.1 for x64 Copyright (C) Microsoft Corporation. All rights reserved. container.cpp Microsoft (R) Incremental Linker Version 14.00.24215.1 Copyright (C) Microsoft Corporation. All rights reserved. /out:container_msvc.exe /dll /out:container_msvc.dll container_msvc.obj Creating library container_msvc.lib and object container_msvc.exp e:WorkDevStackOverflowq050979671>dir /b build.bat container.cpp container.h container_g++.dll container_msvc.dll container_msvc.exp container_msvc.lib container_msvc.obj
如前所述,-DBUILDING_DLL=1
:
- 通过它时,.dll被构建
- 不通过时,会弹出您遇到的错误
由于我没有Dev-C++,我不知道如何从其选项中设置它(尽管我认为这很简单,例如转到">工具 -> 编译器选项"并选择">C++编译器",然后添加宏定义(,所以我将在代码级别启用它。
事情很简单,在容器中.cpp在包含container.h之前定义BUILDING_DLL
,例如:
#define BUILDING_DLL 1
#include "container.h"
就个人而言,我更喜欢这种方法(而不是设置项目选项(,因为它只需要完成一次,无论使用多少个构建系统来构建代码。
运行失败的命令(如上(现在将生成.dll。
相关文章:
- 如何在C++中定义静态成员结构
- 指向重载静态成员的函数指针 - 在unique_ptr中用作自定义删除器
- 在类定义中推导内联静态成员函数的返回类型
- 如何声明和定义具有推导类型的静态成员
- (2 问题)"类"类型重新定义(即使 #pragma 一次),以及静态函数内的静态成员对象初始化?
- 类模板静态数据成员定义/声明/初始化
- 初始化在类类型 #define 中定义的非静态成员数组,不带默认 ctor
- thread_local静态成员模板定义:初始化失败,GCC
- 对类的静态成员的未定义引用
- C++ dll 定义静态成员
- 我正在尝试在我的类中创建一个静态成员,但编译器警告我它是未定义的
- 如何从具有专用化的类模板定义静态成员变量?
- 为什么静态成员函数定义不能有关键字"static"?
- 定义非静态成员时获取C++中的"this"类型
- 声明和定义类静态成员变量不会导致多重声明,这是为什么?
- 有没有办法为静态对象成员定义一个符合开关标准的常量?
- 具有静态模板类成员的模板类:如何定义静态成员
- C 不能将带有父类指针作为类型的静态模板成员定义引用
- 模板超类的静态成员定义
- 带有模板基类的静态成员定义