【问题标题】:Import library creation, C++/VisualStudio2013导入库创建,C++/VisualStudio2013
【发布时间】:2014-03-06 09:10:25
【问题描述】:

我在 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 无法链接时生成它?

【问题讨论】:

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


    【解决方案1】:

    由于缺少(其他)导入库,这会在错误 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 dllfunc
    

    【讨论】:

    • 就是这样!无论出于何种原因,我一直认为 /NODEFAULT 仅适用于 MS 内部库......我的错误。
    • 我尝试将此选项添加到链接器本身,以避免添加预链接事件命令,到目前为止它没有工作(这么多选项)但没什么大不了的......谢谢非常感谢您的帮助。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-10-24
    • 1970-01-01
    • 1970-01-01
    • 2019-12-15
    • 1970-01-01
    相关资源
    最近更新 更多