【问题标题】:Trying to create object files with make on Cygwin尝试在 Cygwin 上使用 make 创建目标文件
【发布时间】:2018-03-13 15:38:24
【问题描述】:

我刚刚下载了 Cygwin,并从 https://cygwin.mirror.constant.com 库中安装了那些有用的软件包:

lynx、wget、curl、rsync、tar、bash-completion、make gcc-c、gcc-g++、gcc-fortran openssh 和 chere

我在论坛上看到它们是您应该拥有的基本软件包。在此之后,我尝试在一个带有 makefile 的文件夹中创建带有 make 的目标文件,但结果如下:

$ make
gcc -g -m32 -g -Wall -c -o tp3.o tp3.c
gcc -g -m32 -g -Wall -c -o equals.o equals.s
gcc -g -m32 -g -Wall -c -o transpose.o transpose.s
gcc -g -m32 -g -Wall -c -o multiply.o multiply.s
gcc -g -m32 -g -Wall -c -o diagonal.o diagonal.s
gcc -g -m32 -g -Wall -c -o average.o average.s
gcc -g -m32 -g -Wall -o tp3 tp3.o equals.o transpose.o multiply.o diagonal.o average.o
/usr/lib/gcc/x86_64-pc-cygwin/6.4.0/../../../../x86_64-pc-cygwin/bin/ld: skipping incompatible /usr/lib/gcc/x86_64-pc-cygwin/6.4.0//libgcc_s.dll.a when searching for -lgcc_s
/usr/lib/gcc/x86_64-pc-cygwin/6.4.0/../../../../x86_64-pc-cygwin/bin/ld: skipping incompatible /usr/lib/gcc/x86_64-pc-cygwin/6.4.0/libgcc_s.dll.a when searching for -lgcc_s
/usr/lib/gcc/x86_64-pc-cygwin/6.4.0/../../../../x86_64-pc-cygwin/bin/ld: skipping incompatible /usr/lib/gcc/x86_64-pc-cygwin/6.4.0//libgcc_s.dll.a when searching for -lgcc_s
/usr/lib/gcc/x86_64-pc-cygwin/6.4.0/../../../../x86_64-pc-cygwin/bin/ld: skipping incompatible /usr/lib/gcc/x86_64-pc-cygwin/6.4.0/libgcc_s.dll.a when searching for -lgcc_s
/usr/lib/gcc/x86_64-pc-cygwin/6.4.0/../../../../x86_64-pc-cygwin/bin/ld: cannot find -lgcc_s
/usr/lib/gcc/x86_64-pc-cygwin/6.4.0/../../../../x86_64-pc-cygwin/bin/ld: skipping incompatible /usr/lib/gcc/x86_64-pc-cygwin/6.4.0//libgcc.a when searching for -lgcc
/usr/lib/gcc/x86_64-pc-cygwin/6.4.0/../../../../x86_64-pc-cygwin/bin/ld: skipping incompatible /usr/lib/gcc/x86_64-pc-cygwin/6.4.0//libgcc.a when searching for -lgcc
/usr/lib/gcc/x86_64-pc-cygwin/6.4.0/../../../../x86_64-pc-cygwin/bin/ld: skipping incompatible /usr/lib/gcc/x86_64-pc-cygwin/6.4.0/libgcc.a when searching for -lgcc
/usr/lib/gcc/x86_64-pc-cygwin/6.4.0/../../../../x86_64-pc-cygwin/bin/ld: skipping incompatible /usr/lib/gcc/x86_64-pc-cygwin/6.4.0/libgcc.a when searching for -lgcc
/usr/lib/gcc/x86_64-pc-cygwin/6.4.0/../../../../x86_64-pc-cygwin/bin/ld: skipping incompatible /usr/lib/gcc/x86_64-pc-cygwin/6.4.0//libgcc.a when searching for -lgcc
/usr/lib/gcc/x86_64-pc-cygwin/6.4.0/../../../../x86_64-pc-cygwin/bin/ld: skipping incompatible /usr/lib/gcc/x86_64-pc-cygwin/6.4.0/libgcc.a when searching for -lgcc
/usr/lib/gcc/x86_64-pc-cygwin/6.4.0/../../../../x86_64-pc-cygwin/bin/ld: cannot find -lgcc
/usr/lib/gcc/x86_64-pc-cygwin/6.4.0/../../../../x86_64-pc-cygwin/bin/ld: skipping incompatible /usr/lib/gcc/x86_64-pc-cygwin/6.4.0/../../../libcygwin.a when searching for -lcygwin
/usr/lib/gcc/x86_64-pc-cygwin/6.4.0/../../../../x86_64-pc-cygwin/bin/ld: skipping incompatible /usr/lib/gcc/x86_64-pc-cygwin/6.4.0/../../../libcygwin.a when searching for -lcygwin
/usr/lib/gcc/x86_64-pc-cygwin/6.4.0/../../../../x86_64-pc-cygwin/bin/ld: skipping incompatible /usr/lib/gcc/x86_64-pc-cygwin/6.4.0/../../../libcygwin.a when searching for -lcygwin
/usr/lib/gcc/x86_64-pc-cygwin/6.4.0/../../../../x86_64-pc-cygwin/bin/ld: cannot find -lcygwin
/usr/lib/gcc/x86_64-pc-cygwin/6.4.0/../../../../x86_64-pc-cygwin/bin/ld: cannot find -ladvapi32
/usr/lib/gcc/x86_64-pc-cygwin/6.4.0/../../../../x86_64-pc-cygwin/bin/ld: cannot find -lshell32
/usr/lib/gcc/x86_64-pc-cygwin/6.4.0/../../../../x86_64-pc-cygwin/bin/ld: cannot find -luser32
/usr/lib/gcc/x86_64-pc-cygwin/6.4.0/../../../../x86_64-pc-cygwin/bin/ld: cannot find -lkernel32
/usr/lib/gcc/x86_64-pc-cygwin/6.4.0/../../../../x86_64-pc-cygwin/bin/ld: skipping incompatible /usr/lib/gcc/x86_64-pc-cygwin/6.4.0//libgcc_s.dll.a when searching for -lgcc_s
/usr/lib/gcc/x86_64-pc-cygwin/6.4.0/../../../../x86_64-pc-cygwin/bin/ld: skipping incompatible /usr/lib/gcc/x86_64-pc-cygwin/6.4.0/libgcc_s.dll.a when searching for -lgcc_s
/usr/lib/gcc/x86_64-pc-cygwin/6.4.0/../../../../x86_64-pc-cygwin/bin/ld: skipping incompatible /usr/lib/gcc/x86_64-pc-cygwin/6.4.0//libgcc_s.dll.a when searching for -lgcc_s
/usr/lib/gcc/x86_64-pc-cygwin/6.4.0/../../../../x86_64-pc-cygwin/bin/ld: skipping incompatible /usr/lib/gcc/x86_64-pc-cygwin/6.4.0/libgcc_s.dll.a when searching for -lgcc_s
/usr/lib/gcc/x86_64-pc-cygwin/6.4.0/../../../../x86_64-pc-cygwin/bin/ld: cannot find -lgcc_s
/usr/lib/gcc/x86_64-pc-cygwin/6.4.0/../../../../x86_64-pc-cygwin/bin/ld: skipping incompatible /usr/lib/gcc/x86_64-pc-cygwin/6.4.0//libgcc.a when searching for -lgcc
/usr/lib/gcc/x86_64-pc-cygwin/6.4.0/../../../../x86_64-pc-cygwin/bin/ld: skipping incompatible /usr/lib/gcc/x86_64-pc-cygwin/6.4.0//libgcc.a when searching for -lgcc
/usr/lib/gcc/x86_64-pc-cygwin/6.4.0/../../../../x86_64-pc-cygwin/bin/ld: skipping incompatible /usr/lib/gcc/x86_64-pc-cygwin/6.4.0/libgcc.a when searching for -lgcc
/usr/lib/gcc/x86_64-pc-cygwin/6.4.0/../../../../x86_64-pc-cygwin/bin/ld: skipping incompatible /usr/lib/gcc/x86_64-pc-cygwin/6.4.0/libgcc.a when searching for -lgcc
/usr/lib/gcc/x86_64-pc-cygwin/6.4.0/../../../../x86_64-pc-cygwin/bin/ld: skipping incompatible /usr/lib/gcc/x86_64-pc-cygwin/6.4.0//libgcc.a when searching for -lgcc
/usr/lib/gcc/x86_64-pc-cygwin/6.4.0/../../../../x86_64-pc-cygwin/bin/ld: skipping incompatible /usr/lib/gcc/x86_64-pc-cygwin/6.4.0/libgcc.a when searching for -lgcc
/usr/lib/gcc/x86_64-pc-cygwin/6.4.0/../../../../x86_64-pc-cygwin/bin/ld: cannot find -lgcc
collect2: error: ld returned 1 exit status
make: *** [Makefile:18: tp3] Error 1

我的Makefile 看起来像这样:

CC=gcc
CFLAGS=-g -m32 -g -Wall
RM=rm -f
TARGET=tp3
OBJECTS=tp3.o equals.o transpose.o multiply.o diagonal.o average.o

.PHONY: clean

.c.o:
    $(CC) $(CFLAGS) -c -o $@ $<

.s.o:
    $(CC) $(CFLAGS) -c -o $@ $<

all: tp3

$(TARGET): $(OBJECTS)
    $(CC) $(CFLAGS) -o $@ $^

clean:
    $(RM) *.o $(TARGET)

汇编文件multiply.s之一的示例:

.globl matrix_multiply_asm

matrix_multiply_asm:
        push %ebp      /* save old base pointer */
        mov %esp, %ebp /* set ebp to current esp */

        /* Write your solution here */

        leave          /* restore ebp and esp */
        ret            /* return to the caller */

它可以安静地编译,但紧随其后的是我试图解决的一个大错误。它说在搜索 -lgcc_s 时 g 不兼容 [...]。当我在 Linux 上工作时,我没有这个错误。有人可以解释一下这是什么意思,我该怎么办?此外,我不太确定在此终端上的 make 命令之后使用什么命令来执行文件 (.dat)。

PS:我当前文件夹的名称是 tp3,里面有 .c、.s 和 .dat 文件。

【问题讨论】:

  • 请将相关文字复制粘贴到您的问题中,而不是发布指向问题图片的链接。
  • 你似乎只安装了 64 位编译器,所以放弃-m32 并希望你的代码兼容:)
  • 您的问题解决了吗?

标签: gcc assembly makefile x86 cygwin


【解决方案1】:

从输出我可以告诉你已经安装了 64 位 Cygwin。您安装的 64 位 Cygwin gcc/g++ 不包含 32 位库和支持文件。这会导致找不到相应文件的问题。您的 Makefile 似乎正在生成 32 位程序(-m32 选项)

你有几个选择:

  • 制作 64 位可执行文件并删除 Makefile 中的 -m32 选项。由于您的教授给您的程序集文件模板有 32 位序言和尾声,因此在您的情况下,这并不是一个真正的选择。看来他们希望您创建一个 32 位程序。
  • 使用 32 位交叉编译器使 32 位可执行文件

如果您希望 64 位 Cygwin 生成 32 位程序,您需要重新运行安装程序并添加以下附加软件包:cygwin32-gcc-corecygwin32-gcc-g++

您必须修改 Makefile,以便使用 i686-pc-cygwin-gcc 而不是 gcc。这可以通过修改来完成:

CC=gcc

成为:

CC=i686-pc-cygwin-gcc

i686-pc-cygwin-gcc 是一个 Cygwin 交叉编译器,可构建 32 位 (i686) 程序,并具有一组 32 位库和生成 32 位 C 程序所需的支持文件.

32 位 Cygwin Windows 交叉编译器将要求您将前导下划线添加到您要导出的函数(通过 .globl 指令)到您的 C 代码。例如,您的 multiply.s 文件必须如下所示:

.globl _matrix_multiply_asm  /* added leading underscore here */

_matrix_multiply_asm:        /* added leading underscore here */
        push %ebp      /* save old base pointer */
        mov %esp, %ebp /* set ebp to current esp */

        /* Write your solution here */

        leave          /* restore ebp and esp */
        ret            /* return to the caller */

您必须对每个.s 文件进行类似的更改。正确组装和链接后,您可以使用以下命令运行它:

./tp3.exe testmatrix2.dat

如果您不希望在您的.s 文件中的导出函数的开头添加下划线,您可以使用 GCC 的-fleading-underscore 选项让您的 make 文件为您添加它们。您仅将其应用于 .s 文件。您的 make 文件可能如下所示:

CC=i686-pc-cygwin-gcc
CFLAGS=-g -m32 -g -Wall
CFLAGS_AS=$(CFLAGS) -fleading-underscore
RM=rm -f
TARGET=tp3
OBJECTS=tp3.o
OBJECTS_AS=equals.o transpose.o multiply.o diagonal.o average.o

.PHONY: clean

.c.o:
    $(CC) $(CFLAGS) -c -o $@ $<

.s.o:
    $(CC) $(CFLAGS_AS) -c -o $@ $<

all: tp3

$(TARGET): $(OBJECTS) $(OBJECTS_AS)
    $(CC) $(CFLAGS) -o $@ $^

clean:
    $(RM) *.o $(TARGET)

【讨论】:

  • 我建议只删除-m32
  • @matzeri 你在我的回答中看到选项Make 64-bit executables and remove the -m32 option in your Makefile了吗。问题是他的任务需要 32 位,因为他们希望在专门使用 32 位的现有函数序言/尾声之间填写他们的代码。我的原始答案(请参阅编辑)对第一个选项的影响更大,直到我找到确切的分配(包含所有文件),然后我选择了使用 32 位代码的答案。您必须意识到 OP 发布的原始问题没有很多上下文。找到作业后,对他的问题进行了大量编辑。
  • @matzeri :所以我建议将其作为一个选项,但指出了为什么在此分配中可能不是一个选项。可能是给别人的,这就是我提到它的原因。对于此分配,可能需要 32 位。这是一个很好的练习,看看如何在 Cygwin 上做到这一点。
  • 如果需要 32 位,他/她可以使用 Cygwin32 位安装。交叉编译似乎是一个额外的复杂因素。
猜你喜欢
  • 2021-01-25
  • 2022-06-13
  • 2014-10-13
  • 2013-01-16
  • 1970-01-01
  • 2016-01-21
  • 2016-06-01
  • 1970-01-01
  • 2020-09-17
相关资源
最近更新 更多