导入库创建,C ++ / VisualStudio2013

时间:2014-03-06 09:10:26

标签: 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无法链接时生成它?

1 个答案:

答案 0 :(得分:0)

  

由于缺少(其他)导入库,因此错误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