理解MSYS2下的LD

时间:2016-03-29 07:48:49

标签: build makefile ld avr-gcc

我正在尝试使用MSYS2和mingw-w64在Windows 10上从https://github.com/buserror/simavr编译simavr项目。

编辑makefile以启用MSYS子句(默认注释掉),并更改2个包含文件的顺序后,我可以让项目进行编译。但是我确实在链接步骤中遇到错误。

输出

C:/Programs/msys64/mingw32/bin/../lib/gcc/i686-w64-mingw32/5.3.0/../../../../i686-w64-mingw32/bin/ld.exe: cannot find -lsimavr

编辑makefile以打印$ {LDFLAGS},产生以下内容。

-L/lib -L/local/lib -L/c/Users/University/GitHub/simavr/simavr/../simavr/obj-i686-w64-mingw32 -lsimavr -lelf -lws2_32

查看构建脚本中提到的文件夹“obj-i686-w64-mingw32”,文件“libsimavr.a”存在。如果我将文件复制到msys lib文件夹,链接步骤可以正常工作。

项目的文件夹结构如下:

  • simavr root(我在哪里运行makefile,位于/ c / Users / University / GitHub)
    • simavr
      • OBJ-i686的-W64-的mingw32

据我所知,LD应该能够在没有我手动复制文件的情况下正确链接。我在这里缺少什么?

修改

链接器错误之前的最后一个命令。

cc -MMD -Werror -O2 -Wall -g -I/usr/local/include -DNO_COLOR   -o obj-i686-w64-mingw32/run_avr.elf obj-i686-w64-mingw32/run_avr.o -L/lib -L/local/lib -L/c/Users/University/GitHub/simavr/simavr/../simavr/obj-i686-w64-mingw32 -lsimavr  -lelf  -lws2_32

编辑2:

清理MSYS文件夹的包含路径:

cc -MMD -Werror -O2 -Wall -g -DNO_COLOR   -o obj-i686-w64-mingw32/run_avr.elf obj-i686-w64-mingw32/run_avr.o -L/c/Users/University/GitHub/simavr/simavr/../simavr/obj-i686-w64-mingw32 -lsimavr  -lelf  -lws2_32
C:/Programs/msys64/mingw32/bin/../lib/gcc/i686-w64-mingw32/5.3.0/../../../../i686-w64-mingw32/bin/ld.exe: cannot find -lsimavr

传递CC = gcc来制作:

gcc -MMD -Werror -O2 -Wall -g -DNO_COLOR   -o obj-i686-w64-mingw32/run_avr.elf obj-i686-w64-mingw32/run_avr.o -L/c/Users/University/GitHub/simavr/simavr/../simavr/obj-i686-w64-mingw32 -lsimavr  -lelf  -lws2_32
C:/Programs/msys64/mingw32/bin/../lib/gcc/i686-w64-mingw32/5.3.0/../../../../i686-w64-mingw32/bin/ld.exe: cannot find -lsimavr

编辑3:

查找命令的输出:

$ find /c/Users/University/GitHub/simavr -name 'libsimavr.a'
/c/Users/University/GitHub/simavr/simavr/obj-i686-w64-mingw32/libsimavr.a

请注意,之前的条目是使用git bash提示符进行的,而不是来自msys2的提示符。但是,在msys2提示符中运行相同的命令或从msys2运行mingw提示符会产生相同的结果。

1 个答案:

答案 0 :(得分:1)

使用mingw-w64工具链来构建项目你必须从CFLAGS / CXXFLAGS / CPPFLAGS中删除所有带有/ usr,/ local,/ lib,/ include的路径,因为这些路径可以包含来自MSYS2本身的头文件和库。其次,尝试将“CC = gcc”传递给makefile。