MS链接从gnu-make失败,但从cmd行工作
MS link fails from gnu make, but works from cmd line
最近我的gnu makefile停止链接我的C++项目。我做了一些改变。我已经复制了链接行,并从批处理文件中运行它。它建造得很好。但奇怪的是,当我运行make时,同一行却失败了。它给出的错误是:
LINK : fatal error LNK1181: cannot open input file 'user32.lib'
这不得不转移注意力,因为在同一命令行提示符下,运行link命令会成功。我开始怀疑GNU制造。这曾经在make
中工作,但我对makefile进行了一些添加和更改,使其在Linux上构建,这似乎引入了问题。
我正在使用:
GNU Make 3.80
MS Visual C++ Linker 10.00.40219.01
在Windows XP上。
我的LIB
和LIBPATH
都包含包含库的SDK目录的路径。我的链接命令如下:
link C:SDL-1.2.14libSDL.lib C:SDL-1.2.14libSDLmain.lib C:SDL-1.2.14libSDL_image.lib C:SDL-1.2.14libSDL_ttf.lib C:SDL-1.2.14libSDL_mixer.lib C:SDL-1.2.14libSDL_net.lib ../../build/lib/sdlhal.lib user32.lib gdi32.lib kernel32.lib oldnames.lib wsock32.lib advapi32.lib comdlg32.lib comctl32.lib wsock32.lib winmm.lib netapi32.lib OpenGL32.lib glu32.lib /nologo /incremental:no -subsystem:console /PDB:../../build/bin/Prog.pdb /OUT:../../build/bin/Prog.exe /MAP:../../build/bin/Prog.map ../../build/Prog/intr/util.obj ../../build/Prog/intr/objwithvel.obj ../../build/Prog/intr/rock.obj ../../build/Prog/intr/explosion.obj ../../build/Prog/intr/ship.obj ../../build/Prog/intr/photon.obj ../../build/Prog/intr/world.obj ../../build/Prog/intr/test.obj ../../build/Prog/intr/main.obj
编辑:下面的C++程序的一些进展。我的环境变量是:
LIB=C:Program FilesMicrosoft Visual Studio 10.0VCLIB;C:Program FilesMicrosoft Visual Studio 10.0VCATLMFCLIB;C:Program FilesMicrosoft SDKsWindowsv7.0Alib;
LIBPATH=C:WINDOWSMicrosoft.NETFrameworkv4.0.30319;C:WINDOWSMicrosoft.NETFrameworkv3.5;C:Program FilesMicrosoft Visual Studio 10.0VCLIB;C:Program FilesMicrosoft Visual Studio 10.0VCATLMFCLIB;
但当由make内部运行的程序打印出来时,它们是:
LIB=.lib
LIBPATH=C:WINDOWSMicrosoft.NETFrameworkv4.0.30319;C:WINDOWSMicrosoft.NETFrameworkv3.5;C:Program FilesMicrosoft Visual Studio 10.0VCLIB;C:Program FilesMicrosoft Visual Studio 10.0VCATLMFCLIB;
根据您对LIB值的描述,我怀疑您只是简单地将makefile中的"LIB"变量设置为".LIB"。在标准GNU make(实际上是make的所有版本)中,当make启动时,所有环境变量都作为make变量导入到make中(也有例外,如SHELL,处理方式不同)。
每当make调用命令时,导入的变量的所有当前值都会写入到子进程的环境中。
换句话说,当make运行配方中的任何命令时,从其环境中读取的任何变量都被视为标记为导出。
所以,如果你有一个像这样的makefile:
LIB = .lib
all: ; @echo "LIB = %LIB%"
你这样运行它:
> set LIB=C:foo;C:bar
> make
则输出将是"LIB=.LIB",而不是"LIB=C:\foo;C:\bar"
我怀疑当从make调用link
时,您的LIB
和LIBPATH
变量并没有按照您认为的方式设置。
尝试创建自己的link.exe
程序,该程序从make调用并转储命令行和环境。这将确切地告诉您makefile是否正确设置了变量。
#include <stdlib.h>
#include <stdio.h>
int main( int argc, char** argv, char** env)
{
int i = 0;
for (i = 0; i < argc; ++i, ++argv) {
if (!(*argv)) {
*argv = "(null)";
}
printf( "arg[%d]: "%s"n", i, *argv);
}
puts("nENVIRONMENT...n");
while (*env) {
printf( "%sn", *env);
++env;
}
return 0;
}
还要检查链接命令行中的错误位置是否没有未引用的空格。虽然它似乎与问题中提到的错误无关(可能实际上只是剪切/粘贴错误),但您给出的链接命令行在explosion.obj
的路径/文件名中间有一个空格。
这可能是路径问题。你使用的是GNU make的mingw版本,还是Cygwin版本?
调试的一种方法是将echo $LIB
和echo $LIBPATH
命令放入make配方中,以确认它们是否按预期设置。
- 从 CMD 运行.exe并自动向其传递参数
- 从大范围内生成一个随机数,但从大范围的中间开始生成较小的范围
- 安卓游戏调试正常,但从Play商店下载时崩溃
- 在 turbo c++ 中使用 TCC 从 cmd 编译C++程序
- 一个类中的QT信号/插槽,但从不同的线程发出
- 简单的cin cout代码由"build and run"运行,但从bin/debug/x开始工作.exe
- 使用Qt从.cmd文件输出读取Echo
- 继承基类,定义基类的原型方法,但从第三个对象调用子类的方法
- 代码运行良好,但从 main() 返回时崩溃
- 从C++调用C++DLL是可行的,但从C#调用则不然
- C++:在CodeBlocks上编译和运行的程序可以工作,但从终端它给出错误语句
- 虽然循环未启动显示 5,但从输入开始,C++
- 尽管使用了 EXTERN "C",但从C++调用 C 函数时链接器出错
- 从“cmd”文件启动的进程创建进程
- 如果应用程序以windows上的管理权限从cmd打开,则会出现访问冲突
- MS链接从gnu-make失败,但从cmd行工作
- 程序从IDE运行时找不到映像目录,但从文件夹运行时却找不到CAN
- 当从Xcode运行时,C++程序在main之前崩溃(但从命令行可以)
- 如何从cmd NOTEPAD /P删除文件名
- 解引用指向size_t的指针,但从void指针强制转换