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

时间:2009-09-16 08:34:27

标签: c++ visual-studio

使用VisualStudio生成COM dll时,我真正所需要的只是从{dll'本身导出的DllCanUnloadNow符号(以及三个相关的符号)。 没人会链接到我的库,因此我根本不会对.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

问题:

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

4 个答案:

答案 0 :(得分:15)

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

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

Configuration Properties > Linker > Advanced > Import Library

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

$(Configuration)\$(TargetName).lib

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

答案 1 :(得分:2)

不确定如何关闭它们,但您可以进行构建后步骤以删除它们,如下所示:

del $(OutDir)\$(ProjectName).lib
del $(OutDir)\$(ProjectName).exp

(在VS2008上它是[Project] - > [Properties],然后是Configuration Properties-> Build Events-> Post-Build Events)

(注意我知道你知道怎么做,但这个答案可能对下一位Google员工有帮助......)

答案 2 :(得分:1)

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

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

答案 3 :(得分:-1)

为什么生成这些文件有问题?当然,如果人们不打算直接链接到他们所有你需要做的就是不分发这些文件,只是简单地分发DLL。