但我不希望我的COM库有.lib或.exp文件!

xto*_*ofl 24 c++ visual-studio

使用VisualStudio生成COM dll时,我真正需要的是DllCanUnloadNow从dll本身导出的符号(以及三个相关的符号). 没有人会链接到我的库,所以我(根本没有)对.lib文件或.exp文件感兴趣.

但是,我没有设法禁止创建这些文件.(注意:我确实知道在构建后的步骤中如何删除它们)

这些是我的链接器参数:

/OUT:"u:/cada-nt/bin/PData.dll" 
/INCREMENTAL:NO 
/NOLOGO 
/DLL 
/MANIFEST:NO 
/DEF:"PData.def" 
/DEBUG 
/PDB:"u:/cada-nt/pdb/PData.pdb" 
/ERRORREPORT:PROMPT kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib 
                    advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib 
                    odbc32.lib odbccp32.lib
Run Code Online (Sandbox Code Playgroud)

问题:

  • 有没有人成功生成.lib和.exp文件?
  • 有谁知道为什么生成这些文件?

gar*_*kin 16

Visual Studio的链接器有一个/IMPLIB选项,允许您指定.lib.exp文件的输出位置.

您可以在项目的属性中修改此选项:

Configuration Properties > Linker > Advanced > Import Library
Run Code Online (Sandbox Code Playgroud)

您可以将其设置为以下内容,例如:

$(Configuration)\$(TargetName).lib
Run Code Online (Sandbox Code Playgroud)

链接器将.exp使用与其相同的名称创建文件.lib.

  • 这不是OP所要求的.他根本不想要链接器创建的那些文件,而不是另一个文件夹 (5认同)

小智 5

COM 库中有一些函数声明为 __declspec(dllexport)。这意味着它们被导出(可能被GetProcAdress函数使用)并且链接器认为需要链接到这个动态库(无论是exe还是dll - 一般来说结构是相同的)并创建*.lib和 *.exp 文件。

为了避免创建这些文件,您需要从函数声明中删除所有 __declspec(dllexport)


Goz*_*Goz -6

为什么生成这些文件会出现问题?当然,如果人们不打算直接链接到它们,那么您所需要做的就是不分发这些文件,而只分发 DLL。

  • 没有什么紧急的问题。我什至有一个解决方法。链接器生成它们是没有用的。这些文件自动位于输出文件夹中,位于我需要分发的 dll 旁边。它很混乱。这很烦人。 (14认同)
  • -1:这是一个完全合理的要求。我也请求它,出于同样的原因,这些文件很烦人。 (14认同)
  • 不,obj 文件并不那么烦人,因为它们位于中间目录中。exp 和 lib 位于我干净的输出目录中......这就是区别。 (7认同)
  • 我的用例 100% 相同。我不想生成这些文件。 (4认同)
  • @demoncodemonkey:习惯了。我怀疑你也想摆脱那些烦人的 obj 文件...令我震惊的是,有些人担心一些如此无关紧要的事情,但最终却非常有用。 (3认同)