Visual studio 2010 VS def文件共享库中的静态库:dllexport的替代方案?
我正在用静态库(全部为C++)和由这些静态库(dumpbin.exe/LINKERMEMBERS)中包含的所有符号生成的模块定义文件(.def)构建一个dll 如果我按原样构建静态libs,将其链接到dll中,则会丢失一些符号(即内联函数),因此我必须在静态libs中dllexport以强制显式实例化符号,但当我使用这些静态libs(没有dll)静态编译程序时,导出会产生一些不必要的副作用(警告4217和4049是合法的,.exp文件和在.exe程序本身中导出的所有符号) 所以,我的问题是: stackoverlow是否知道VS2010(或VS2012)的magic属性或declspec强制实例化符号而不导出它(但不导出noinline)?或者如何删除静态库的导出(保留符号) PS:我需要使用相同的静态库来创建dll或进行简单的静态链接,以获得大量的编译时间 编辑:这很棘手,我希望它能帮助我:Visual studio 2010 VS def文件共享库中的静态库:dllexport的替代方案?,visual-studio-2010,dll,shared-libraries,static-libraries,dllexport,Visual Studio 2010,Dll,Shared Libraries,Static Libraries,Dllexport,我正在用静态库(全部为C++)和由这些静态库(dumpbin.exe/LINKERMEMBERS)中包含的所有符号生成的模块定义文件(.def)构建一个dll 如果我按原样构建静态libs,将其链接到dll中,则会丢失一些符号(即内联函数),因此我必须在静态libs中dllexport以强制显式实例化符号,但当我使用这些静态libs(没有dll)静态编译程序时,导出会产生一些不必要的副作用(警告4217和4049是合法的,.exp文件和在.exe程序本身中导出的所有符号) 所以,我的问题是: s
libD.def gen from libS.lib's symbols
so libD will dllexport Func()
+----------------------------------+
| V
+----------------+ +-------------+
| libS.lib | static link libS.lib | libD.dll |
| |--------------------------->|( dllexport |
|dllexport Func()| | Func() ) |
+----------------+ +-------------+ +-------------+
| | libP.lib | |
| static link | dllimport | | dyn link
| libS.lib | Func() | |
| +-------------+ |
V | static | V
+----------------+ | link | +-------------+
| a.exe |<------+ +------->| b.exe |
| | | dllimport |
| Func() | | Func() |
+----------------+ dllimport +-------------+
!!- will have exported Func() OK
Func() in the .exe
!!- will warn about
Func() localy defined
but imported
libS.lib符号中的libD.def gen
所以libD将使用dllexport Func()
+----------------------------------+
|五
+----------------+ +-------------+
|libS.lib |静态链接libS.lib | libD.dll|
||----------------------------------->|(dllexport|
|dllexport Func()| | Func())|
+----------------+ +-------------+ +-------------+
|| libP.lib ||
|静态链接| dllimport |动态链接
|libS.lib | Func()||
| +-------------+ |
V |静态| V
+----------------+|链接|+-------------+
|a.exe | | b.exe|
|| |德林波特|
|Func()| | Func()|
+----------------+德林波特+-------------+
!!-将导出Func()确定
.exe中的Func()
!!-将警告
Func()本地定义
但是进口的
注意:奇怪的事情发生了:a.exe将导出Func(),即使“Func.h”没有dllexport它(我这样做是因为在libS.lib中编译了dllexport),但我必须显式地为libD.dll中的dllexport Func()生成一个def文件…我不太清楚您要求的是什么,但通常dllexport/dlliport是通过宏定义的(在库及其用户中重复使用相同的头)。对于任何新的库项目,它都应该是VS默认值。是的,我使用宏。但我想使用相同的库(即.lib库)对于静态链接和动态链接,通过链接该静态库的中间dll。但要正确生成该dll的.def文件,我需要dllexport来创建符号,但使用dllexport编译的同一个库也用作简单的静态库,这里出现了问题…我的意思是:使用三个宏来定义所有内容的方式(dllimport/dllexport/nothing)必须翻译。一个用于你的库,一个用于你的中间库(顺便说一句,你是如何解决名称问题的?),还有一个用于最终用户。我添加了一些细节。什么名称问题?