我在VisualStudio (2013年)中创建了一组VisualStudio DLL及其导入库。到目前为止,所有这些都是由链接器同时生成的。我的DLL使用来自其他库的符号,这些符号作为附加依赖项包含在属性/链接版本中。
有时,DLL生成由于缺少导入库而失败,这对我来说很好,但在这种情况下,也没有生成的.lib文件。我想要生成导入库(我的DLL),即使DLL无法完成,以便允许其他项目依赖于我将导出的符号,然后才能提供全部内容。
我通过一个预链接事件命令行找到了一个解决办法,包括:
LIB /DEF:(...)\myLib.def /OUT:(...)\myLib.lib $(IntDir)*.obj当我有一个.def文件时,这就产生了我所需要的。
问题是,我通常没有这样的.def文件,而是依赖于__declspec(dllexport)指令,在这种情况下,我没有找到获得正确结果的方法。
我试过:
LIB /OUT:(...)\myLib.lib $(IntDir)*.obj (#1)
这会创建一个(静态的?)lib文件,不是导入库,不是我需要的。LIB /DEF /OUT:(...)\myLib.lib $(IntDir)*.obj (#2)
这在错误1104上失败,原因是缺少(其他)导入库。更让我费解的是,命令行(#2)在应该在这里的库上失败(实际上,它们是由链接器找到的)。我想知道我是否应该为LIB命令提供完整的链接命令行参数,在这种情况下,这将是一个禁止。
我不是编译/链接工具的专家,我担心,我可能做错了.
有人知道不使用.def文件来满足我的需求的简单方法吗?链接器中是否有请求从声明的__declspec(dllexport)符号创建导入库的选项,并在DLL无法链接时生成它?
发布于 2014-03-06 11:10:14
这在错误1104上失败,原因是缺少(其他)导入库。
编辑:哦,我明白了。.obj文件中有/DEFAULTLIB:,lib抱怨。使用/NODEFAULTLIB
hasunresolved.c
#pragma comment(lib, "missinglib.lib")
void missingfunc();
__declspec(dllexport)
void dllfunc() {
missingfunc();
}usedll.c
__declspec(dllimport)
void dllfunc();
int main() {
dllfunc();
return 0;
}在VS命令提示符中:
cl -c hasunresolved.c
lib /def /OUT:test.lib hasunresolved.obj
rem this prints: LIB : fatal error LNK1104: cannot open file 'missinglib.lib'
lib /NODEFAULTLIB /def /OUT:test.lib hasunresolved.obj
cl usedll.c test.lib
dumpbin /IMPORTS:test.dll usedll.exe产出:
Dump of file usedll.exe
test.dll
0 dllfunchttps://stackoverflow.com/questions/22219753
复制相似问题