c++ - 导入库创建,C++/VisualStudio2013

标签 c++ dll linker visual-studio-2013

我在 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/

相关文章:

c++ - 指向彼此的对象的 priority_queue

C++:数组的构造函数初始化器

c++ - 在 Visual Studio 2015 中编译的 DLL 抛出 0xc000007b 错误

c++ - 链接器错误 - 未解析的外部符号

c - 使用 C 语言进行数据封装的 OOP 编程

c++ - 数组大小未传递给函数

c++ - 从 QList 中删除一个项目会抛出错误

c++ - 检测伴随 DLL 链接和通信 (C++)

c# - HtmlAgilityPack.HtmlDocument() 导致错误

c++ - 非模板类与模板类的多重定义