Nor*_*wap 4 c++ dll linker mingw inline
我正在使用一个共享库,在其标题中定义内联函数.
下面是一个简化的测试情况下,由编译单元链接到库(库所看到的版本,只需更换所看到dllimport通过dllexport).
class __declspec(dllimport) MyClass {
public:
int myFunc2();
int myFunc1();
};
inline int MyClass::myFunc2(void) {
return myFunc1();
}
inline int MyClass::myFunc1(void) {
return 0;
}
Run Code Online (Sandbox Code Playgroud)
编译它会发出警告:
警告:'int MyClass :: myFunc1()'在用dll链接引用后重新声明没有dllimport属性[默认启用]
请注意,定义函数的顺序很重要,因为在结果定义myFunc1之前定义myFunc2没有警告.
另请注意,此代码在Visual C++下编译时没有警告.这些警告至少对MinGW来说是特定的,也许对GCC来说是一般的.编辑:我想到我可能必须验证警告是否未被项目设置的标志之一禁止.
我的问题是:
myFunc1为inline类声明内部可以解决问题.这是为什么 ?这也违背了推荐的做事方式.问题的出现是因为dllimport的工作方式有些神奇,通常意味着你只需要在第一次声明时使用它.
基本上,当你将一个函数声明为dllimport然后在除了dllimport之外用相同的声明重新声明该函数时,第二个声明隐式地获得dllimport.如果重新声明不相同,则不会获得隐式dllimport.
那么这里发生的是你首先将函数声明为dllimport/non-inline,然后将其声明为非dllimport/inline.在第一个声明中添加内联可以解决问题,因为第二个声明会隐式变为dllimport.或者,__declspec(dllimport)在第二个声明中添加a 应该可以解决问题.
请注意,重新排序定义会消除警告,因为警告是在重新声明之前使用它.通过重新排序,您在重新声明之前不再使用它,因此您不会收到任何警告,尽管它将使用非dllimport版本(即,它永远不会使用dll中的函数版本).
另请注意,使用内联dllimport是危险的.任何针对dll构建的程序都可能在某些地方使用内联函数,而在其他地方使用非内联函数(来自dll).即使这两个函数现在完全相同,dll的未来版本也可能会发生变化并具有不同的实现.如果使用新版本的dll运行,那么旧程序可能会开始行为不端.
| 归档时间: |
|
| 查看次数: |
5703 次 |
| 最近记录: |