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

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

所以,我的问题是:

stackoverlow是否知道VS2010(或VS2012)魔术属性或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

注意:奇怪的事情发生:a.exe将导出Func(),即使“func.h”没有dllexport它(我的事情是因为在libS.lib中编译的dllexport),但我必须显式生成一个def文件到libD.dll中的dllexport Func()...