gpt4 book ai didi

c++ - MS 链接从 gnu make 失败,但从 cmd 行工作

转载 作者:可可西里 更新时间:2023-11-01 11:21:14 25 4
gpt4 key购买 nike

最近我的 gnu makefile 停止链接我的 C++ 项目。我做了一些改变。我已经复制了链接行并从批处理文件中运行它。它构建良好。但是当我运行 make 时,同一行奇怪地失败了。它给出的错误是:

LINK : fatal error LNK1181: cannot open input file 'user32.lib'

这一定是个误会,因为在同一个命令行提示符下,运行链接命令会成功。我开始怀疑 GNU make。这曾经在 make 中工作,但我对 makefile 进行了一些添加和更改以使其在 Linux 上构建,这似乎引入了问题。

我正在使用:

GNU Make 3.80
MS Visual C++ Linker 10.00.40219.01

在 Windows XP 上。

我的 LIBLIBPATH 都包含指向包含库的 SDK 目录的路径。我的链接命令如下:

link  C:\SDL-1.2.14\lib\SDL.lib C:\SDL-1.2.14\lib\SDLmain.lib C:\SDL-1.2.14\lib\SDL_image.lib C:\SDL-1.2.14\lib\SDL_ttf.lib C:\SDL-1.2.14\lib\SDL_mixer.lib C:\SDL-1.2.14\lib\SDL_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 Files\Microsoft Visual Studio 10.0\VC\LIB;C:\Program Files\Microsoft Visual Studio 10.0\VC\ATLMFC\LIB;C:\Program Files\Microsoft SDKs\Windows\v7.0A\lib;
LIBPATH=C:\WINDOWS\Microsoft.NET\Framework\v4.0.30319;C:\WINDOWS\Microsoft.NET\Framework\v3.5;C:\Program Files\Microsoft Visual Studio 10.0\VC\LIB;C:\Program Files\Microsoft Visual Studio 10.0\VC\ATLMFC\LIB;

但是当从 make 中运行的程序打印出来时,它们是:

LIB=.lib
LIBPATH=C:\WINDOWS\Microsoft.NET\Framework\v4.0.30319;C:\WINDOWS\Microsoft.NETFramework\v3.5;C:\Program Files\Microsoft Visual Studio 10.0\VC\LIB;C:\Program Files\Microsoft Visual Studio 10.0\VC\ATLMFC\LIB;

最佳答案

根据您对 LIB 值的描述,我怀疑您只是在 makefile 中设置了“LIB”变量(到“.lib”)。在标准的GNU make(实际上是make的所有版本)中,所有的环境变量都在make启动时作为make变量导入到make中(也有异常(exception),比如SHELL,处理方式不同)。

每当 make 调用命令时,导入的变量的所有当前值都会写出到子进程的环境中。

换句话说,当 make 从配方运行任何命令时,任何从其环境中读取的变量都被视为标记为导出。

因此,如果您有这样的 makefile:

LIB = .lib
all: ; @echo "LIB = %LIB%"

然后你像这样运行它:

> set LIB=C:\foo;C:\bar
> make

那么输出将是“LIB = .lib”,而不是“LIB = C:\foo;C:\bar”

关于c++ - MS 链接从 gnu make 失败,但从 cmd 行工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9219817/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com