我在VisualStudio(2013)中创建了一组C ++ 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命令提供完整的LINK命令行参数,在这种情况下它将是一个禁忌。
我不是编译/链接工具的专家,我担心,我可能做错了很多......
有没有人知道在不使用.def文件的情况下满足我需求的简单方法?链接器中是否有一个选项要求从声明的__declspec(dllexport)
符号创建导入库,并在DLL无法链接时生成它?
答案 0 :(得分:0)
编辑:哦,我明白了。 .obj文件中包含由于缺少(其他)导入库,因此错误1104失败。
/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 dllfunc