引用link.exe的奇怪VC链接器错误LNK1107

时间:2011-06-14 16:07:28

标签: c++ visual-studio-2005 linker

我出现了一个非常奇怪的链接器错误:

link.exe : fatal error LNK1107: invalid or corrupt file: cannot read at 0x270

但这很奇怪,因为通常错误消息会告诉您哪些对象无效或已损坏。换句话说,通常此错误消息如下所示:

myDLL.dll : fatal error LNK1107: ....

但是,在这种情况下,无效对象是正在运行的应用程序本身(link.exe)!

我尝试用另一个我知道有效的副本替换可执行文件。同样的错误。

我正在运行的命令是:

../vendor/microsoft/msdev80_2005/VC/bin/link.exe /NOLOGO /SUBSYSTEM:CONSOLE /LIB
PATH:../vendor/microsoft/msdev80_2005/VC/atlmfc/lib /LIBPATH:../vendor/microsoft
/msdev80_2005/VC/lib /LIBPATH:../vendor/microsoft/msdev80_2005/VC/PlatformSDK/Li
b /LIBPATH:lib/win32/dbg /OUT:bin/win32/dbg/bugshow.exe Advapi32.lib ws2_32.lib
bugshow/obj/win32/dbg/main.o libA.lib libB.lib libC.lib libD.lib

main.o正在使用以下编译器指令进行编译:

../vendor/microsoft/msdev80_2005/VC/bin/cl.exe /nologo /X /w /EHsc -I../vendor/m
icrosoft/msdev80_2005/VC/atlmfc/include -I../vendor/microsoft/msdev80_2005/VC/in
clude -I../vendor/microsoft/msdev80_2005/VC/PlatformSDK/Include /D_WIN32 /DBOOST
_USE_WINDOWS_H /DWIN32_LEAN_AND_MEAN /D_WIN32_WINNT=0x0501 /DBOOST_THREAD_USE_LI
B /DBOOST_ALL_NO_LIB /D_CRT_SECURE_NO_DEPRECATE /D_CRT_NONSTDC_NO_DEPRECATE /Z7
/MTd /c -I../vendor/boost.org/boost/1.45.0/include /Fobugshow/obj/win32/dbg/main.o 
bugshow/main.cpp

任何想法为什么link.exe会像这样失败?

更新

当我将link.exe所在的文件夹添加到我的PATH中,然后调用没有路径前缀的link.exe时,我收到以下错误:

LINK: fatal error LNK1181: cannot open input file 'link.exe'

为什么link.exe如此拼命地打开自己??!?!

2 个答案:

答案 0 :(得分:5)

我发现了问题!

MSVC链接器在Microsoft的MSDN页面上使用了一个令人讨厌的小环境变量(described here)。它说:

LINK, if defined, prepends arguments in the command line.

我安装的最新应用程序将我的系统的环境变量LINK定义为STATIC。这导致link.exe解释自身的命令行实例化,如下所示:

STATIC link.exe /NOLOGO /SUBSYSTEM:CONSOLE ...

换句话说,*argv[1]通常是第一个命令行参数,实际上是link.exe。它基本上将所有参数减少了一个偏移量。这反过来导致link.exe尝试将自己解释为其第一个输入文件!

绝对是令人难以置信的令人沮丧且难以察觉的问题...

答案 1 :(得分:0)

我读到当你在链接器中包含头文件(.h)时会产生这个错误。我遇到了这个问题并通过删除链接器中的.h解决了这个问题。输入> Addtl Dependencies