我已经尝试配置GCC 9.3.0来生成DOS的可执行文件。然而,对于一个简单的“你好世界!”程序以C语言编写,它输出:
/home/teo.samarzija/djgpp-9.3.0/lib/gcc/djgpp/9.3.0/../../../../djgpp/bin/ld: /home/teo.samarzija/djgpp-9.3.0/lib/gcc/djgpp/9.3.0/../../../../djgpp/lib/libc.a(crt1.o):crt1.c:(.text+0xd6): undefined reference to `_environ'
/home/teo.samarzija/djgpp-9.3.0/lib/gcc/djgpp/9.3.0/../../../../djgpp/bin/ld: /home/teo.samarzija/djgpp-9.3.0/lib/gcc/djgpp/9.3.0/../../../../djgpp/lib/libc.a(crt1.o):crt1.c:(.text+0x10b): undefined reference to `_environ'
/home/teo.samarzija/djgpp-9.3.0/lib/gcc/djgpp/9.3.0/../../../../djgpp/bin/ld: /home/teo.samarzija/djgpp-9.3.0/lib/gcc/djgpp/9.3.0/../../../../djgpp/lib/libc.a(crt1.o):crt1.c:(.text+0x131): undefined reference to `_environ'
/home/teo.samarzija/djgpp-9.3.0/lib/gcc/djgpp/9.3.0/../../../../djgpp/bin/ld: /home/teo.samarzija/djgpp-9.3.0/lib/gcc/djgpp/9.3.0/../../../../djgpp/lib/libc.a(crt1.o):crt1.c:(.text+0x141): undefined reference to `_environ'
/home/teo.samarzija/djgpp-9.3.0/lib/gcc/djgpp/9.3.0/../../../../djgpp/bin/ld: /home/teo.samarzija/djgpp-9.3.0/lib/gcc/djgpp/9.3.0/../../../../djgpp/lib/libc.a(crt1.o):crt1.c:(.text+0x3d4): undefined reference to `_environ'
/home/teo.samarzija/djgpp-9.3.0/lib/gcc/djgpp/9.3.0/../../../../djgpp/bin/ld: /home/teo.samarzija/djgpp-9.3.0/lib/gcc/djgpp/9.3.0/../../../../djgpp/lib/libc.a(getenv.o):getenv.c:(.text+0x4): more undefined references to `_environ' follow
collect2: error: ld returned 1 exit statusdjgpp-gcc -v输出:
Using built-in specs.
COLLECT_GCC=djgpp-gcc
COLLECT_LTO_WRAPPER=/home/teo.samarzija/djgpp-9.3.0/libexec/gcc/djgpp/9.3.0/lto-wrapper
Target: djgpp
Configured with: ../gcc-9.3.0/configure --target=djgpp --prefix=/home/teo.samarzija/djgpp-9.3.0 --enable-languages=c,c++,objc,ada,fortran,go
Thread model: single
gcc version 9.3.0 (GCC) 我还编译了GNU链接器和GNU汇编程序的最新版本,它们输出为它们的版本:
GNU ld (GNU Binutils) 2.34
Copyright (C) 2020 Free Software Foundation, Inc.
This program is free software; you may redistribute it under the terms of
the GNU General Public License version 3 or (at your option) a later version.
This program has absolutely no warranty.和
GNU assembler (GNU Binutils) 2.34
Copyright (C) 2020 Free Software Foundation, Inc.
This program is free software; you may redistribute it under the terms of
the GNU General Public License version 3 or later.
This program has absolutely no warranty.
This assembler was configured for a target of `djgpp'.知道我做错了什么吗?GCC或煤气或GLD是否在过去一段时间内停止支持DOS?我想没有,因为他们在没有警告的情况下将DOS编译为一个目标。
发布于 2020-06-25 19:04:04
我无意中发现了这个问题,因为您最近询问了一些在NTVDM虚拟DOS会话中没有在32位Windows 10中正确运行的代码。
问题是您没有正确地构建DJGPP交叉编译器和所有所需的组件。您没有向我们展示您在构建过程中使用了哪些命令,使用了哪些版本的依赖项,以及它们来自何处。
您需要做的第一件事是构建一个DJGPP交叉编译器。有些人会维护脚本来做到这一点。我成功使用的一个构建环境/脚本是来自用户吴安祥的。它使用起来很简单。根据您向我们展示的输出,您似乎在使用Unix类型的环境。由于您成功地构建了DJGPP (尽管其中一个不能工作),我将假设您已经安装了所有必要的构建工具。首先用以下方法检索脚本:
git clone https://github.com/andrewwutw/build-djgpp将以下内容转换为项目目录:
cd build-djgpp查看README.md文件!它告诉您脚本支持什么版本,为您所使用的操作系统类型构建需求等等。目前,它们一直支持10.1.0版本。如果您有所需的所有内容,请选择要构建的版本(我将使用9.3.0,因为它是您正在使用的版本),然后启动构建。在安装到/usr/local/djgpp目录时,您必须以根用户身份构建或使用/usr/local/djgpp。
./build-djgpp.sh 9.3.0这将需要一段时间,但当它完成时,应该安装和准备使用。命名约定与以djgpp-作为前缀的命令略有不同。此脚本使用更完整的目标前缀i586-pc-msdosdjgpp-构建东西。
若要将其添加到路径并设置其他环境变量,请使用:
. /usr/local/djgpp/setenv如果您希望每次登录时都这样做,请将该行添加到shell登录脚本中。对于~/.bashrc文件中的BASH
创建一个名为hello.c的文件,其中包含:
#include<stdio.h>
int main()
{
printf("Hello, world!\n");
}将其编译到一个名为hello.exe的文件中
i586-pc-msdosdjgpp-gcc -O3 -Wall -Wextra hello.c -o hello.exe 假设您安装了DPMI主机(如CWSDPMI.EXE),hello.exe应该在FreeDOS、FreeDOS、DOSBox、Windows会话中运行。运行时,它应该显示:
你好,世界!
如果您不希望从头开始构建,那么Andrew有许多最新的DJGPP版本的预制包。可以使用的平台有MacOS、Linux32、Linux64、MinGW和一个不需要MinGW环境运行的MinGW独立版本。
https://stackoverflow.com/questions/62500891
复制相似问题