Visual studio 2010 VS def文件共享库中的静态库:dllexport的替代方案?

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

我正在用静态库(全部为C++)和由这些静态库(dumpbin.exe/LINKERMEMBERS)中包含的所有符号生成的模块定义文件(.def)构建一个dll

如果我按原样构建静态libs,将其链接到dll中,则会丢失一些符号(即内联函数),因此我必须在静态libs中dllexport以强制显式实例化符号,但当我使用这些静态libs(没有dll)静态编译程序时,导出会产生一些不必要的副作用(警告4217和4049是合法的,.exp文件和在.exe程序本身中导出的所有符号)

所以,我的问题是:

stackoverlow是否知道VS2010(或VS2012)的magic属性或declspec强制实例化符号而不导出它(但不导出noinline)?或者如何删除静态库的导出(保留符号)

PS:我需要使用相同的静态库来创建dll或进行简单的静态链接,以获得大量的编译时间

编辑:这很棘手,我希望它能帮助我:

               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)必须翻译。一个用于你的库,一个用于你的中间库(顺便说一句,你是如何解决名称问题的?),还有一个用于最终用户。我添加了一些细节。什么名称问题?