我正在使用静态库(所有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()...