我在 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 无法链接时生成它?
最佳答案
This fails on error 1104 because of missing (other) import libraries.
编辑:哦,我明白了。 .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 dllfunc
关于c++ - 导入库创建,C++/VisualStudio2013,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22219753/