当用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文件吗?
- 有人知道 * 为什么 * 生成这些文件吗?
6条答案
按热度按时间x33g5p2x1#
Visual Studio的链接器有一个
/IMPLIB
选项,允许您指定.lib
和.exp
文件的输出位置。可以在项目属性中修改此选项:
例如,您可以将其设置为:
链接器将创建与
.lib
同名的.exp
文件。ycl3bljg2#
COM库中有一些函数声明为__declspec(dllexport),这意味着它们被导出(可能被GetProcAdress函数使用),linker认为有必要链接这个动态库(不管是exe还是dll --一般结构都是一样的),并创建了 *.lib和 *.exp文件。
要避免创建这些文件,您需要从函数声明中删除所有__declspec(dllexport)
pbgvytdp3#
/NOIMPLIB
将阻止生成.lib
文件。我不知道如何避免.exp
文件。jhdbpxl94#
不确定如何关闭它们,但可以执行生成后步骤来移除它们,如下所示:
(on VS 2008是[项目]-〉[属性],然后是配置属性-〉生成事件-〉生成后事件)
(note我知道你知道如何做到这一点,但这个答案可能会帮助下一个谷歌人...)
6rqinv9w5#
我想您可以挂接
kernel32.dll
CreateFile
/WriteFile
/CloseHandle
,然后将其直接重定向到nul
。bxfogqkk6#
为什么生成这些文件是一个问题?当然,如果人们不打算直接链接到它们,你需要做的就是不分发这些文件,而只是分发DLL。