我有一个 makefile,需要使用 2 个不同版本的 GCC,以便在同一调用中输出不同的可执行文件。具体来说,我使用的一种是针对旧的 32 位 Windows 计算机,另一种是针对较新的计算机。不幸的是,诸如
-m32
等开关本身并不能解决问题,我确实需要 2 个不同版本的 GCC。
当我将两个版本添加到PATH
并直接在makefile中调用它们时,我遇到了
奇怪的错误。这被理论上归因于 GCC 的模块化设计。我的makefile的基本思想如下:
GCC_32 = i686-w64-mingw32-gcc
GCC_64 = x86_64-w64-mingw32-gcc
win_32_bit: $(COMMON_REQUIREMENTS_NOT_IN_EXAMPLE)
$(GCC_32) -mwindows -m32 -march=pentium $^ old_main_file.cpp -static-libstdc++ $(LIBS_NOT_IN_EXAMPLE) -o old.exe
win_64_bit: $(COMMON_REQUIREMENTS_NOT_IN_EXAMPLE)
$(GCC_64) -mwindows -m64 -march=core2 $^ new_main_file.cpp -static-libstdc++ $(LIBS_NOT_IN_EXAMPLE) -o new.exe
如果我从
PATH
中删除对 GCC 的所有引用,然后对路径进行硬编码,那么代码就可以工作了。
GCC_32 = /mingw32/bin/i686-w64-mingw32-gcc
GCC_64 = /mingw64/bin/x86_64-w64-mingw32-gcc
# The rest is the same
显然,硬编码路径不好且不可移植。我宁愿找出发生冲突的原因并编写一个处理它的 makefile。也许有办法,例如相互隐藏其他编译器,或者从
PATH
收集路径,删除它们,然后将它们注入到 makefile 中
您可以要求 shell 为您计算路径:
GCC_32 := $(shell which i686-w64-mingw32-gcc)
GCC_64 := $(shell which x86_64-w64-mingw32-gcc)
但这只是掩盖了它在没有绝对路径的情况下无法工作的问题......