【问题标题】:What's wrong with my cross compiling makefile?我的交叉编译makefile有什么问题?
【发布时间】:2018-09-13 08:29:27
【问题描述】:

我花了几天时间尝试在我的 Windows 机器上交叉编译一个 c 程序。该代码在我的 linux 机器上运行良好,但尝试在该机器上交叉编译它时出现了太多错误。现在我正在使用 Cygwin 和 Mingw32。

    CC = x86_64-w64-mingw32-gcc
    CFLAGS = -Wall -O2 -lmingw32 -lGL -lGLU -lm -lSDL_image -lfftw3 -lftdi1 
    -mwindows `sdl-config --cflags --libs`

    OBJECTS = main.o fft.o draw.o table.o serial.o

    main : $(OBJECTS)
    $(CC) $(CFLAGS) $(OBJECTS) -o main

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

    clean:
    @echo Cleaning up...
    rm -fr *.o main
    @echo Done.

这是我的 makefile 在将其编辑为我认为交叉编译所需的内容后的样子。但是我得到了许多未定义的参考错误。我意识到这个问题与我在 SO 上查看过的其他几个问题非常相似,但我似乎找不到我的错误。

 $ make
 x86_64-w64-mingw32-gcc -Wall -O2 -lmingw32 -lGL -lGLU -lm -lSDL_image - 
 lfftw3 -lftdi1 -mwindows `sdl-config --cflags --libs` -c main.c
 x86_64-w64-mingw32-gcc -Wall -O2 -lmingw32 -lGL -lGLU -lm -lSDL_image - 
 lfftw3 -lftdi1 -mwindows `sdl-config --cflags --libs` -c fft.c
 x86_64-w64-mingw32-gcc -Wall -O2 -lmingw32 -lGL -lGLU -lm -lSDL_image - 
 lfftw3 -lftdi1 -mwindows `sdl-config --cflags --libs` -c draw.c
 x86_64-w64-mingw32-gcc -Wall -O2 -lmingw32 -lGL -lGLU -lm -lSDL_image - 
 lfftw3 -lftdi1 -mwindows `sdl-config --cflags --libs` -c table.c
 x86_64-w64-mingw32-gcc -Wall -O2 -lmingw32 -lGL -lGLU -lm -lSDL_image - 
 lfftw3 - 
 lftdi1 -mwindows `sdl-config --cflags --libs` -c serial.c
 x86_64-w64-mingw32-gcc -Wall -O2 -lmingw32 -lGL -lGLU -lm -lSDL_image - 
 lfftw3 - 
 lftdi1 -mwindows `sdl-config --cflags --libs` main.o fft.o draw.o table.o 
 serial.o -o main
/usr/x86_64-w64-mingw32/sys-root/mingw/lib/../lib/libmingw32.a(lib64_libmingw32_a-crt0_c.o): In function `main':
/usr/src/debug/mingw64-x86_64-runtime-5.0.3-1/crt/crt0_c.c:18: undefined reference to `WinMain'
fft.o:fft.c:(.text+0xa): undefined reference to `fftw_malloc'
fft.o:fft.c:(.text+0x1b): undefined reference to `fftw_malloc'
fft.o:fft.c:(.text+0x2c): undefined reference to `fftw_malloc'
fft.o:fft.c:(.text+0x4d): undefined reference to `fftw_plan_dft_r2c_1d'
fft.o:fft.c:(.text+0x73d): undefined reference to `fftw_execute'
draw.o:draw.c:(.text+0xb): undefined reference to `__imp_glShadeModel'
draw.o:draw.c:(.text+0x1e): undefined reference to `__imp_glClearColor'
draw.o:draw.c:(.text+0x43): undefined reference to `gluOrtho2D'
draw.o:draw.c:(.text+0x4e): undefined reference to `__imp_glDisable'
draw.o:draw.c:(.text+0x5e): undefined reference to `__imp_glEnable'
draw.o:draw.c:(.text+0x82): undefined reference to `__imp_glViewport'
draw.o:draw.c:(.text+0x8e): undefined reference to `__imp_glMatrixMode'
draw.o:draw.c:(.text+0x97): undefined reference to `__imp_glLoadIdentity'
draw.o:draw.c:(.text+0xbe): undefined reference to `gluOrtho2D'
draw.o:draw.c:(.text+0xeb): undefined reference to `SDL_Init'
draw.o:draw.c:(.text+0xf4): undefined reference to `SDL_GetVideoInfo'
draw.o:draw.c:(.text+0x11c): undefined reference to `SDL_GL_SetAttribute'
draw.o:draw.c:(.text+0x13a): undefined reference to `SDL_SetVideoMode'
draw.o:draw.c:(.text+0x171): undefined reference to `SDL_GetError'
draw.o:draw.c:(.text+0x1a1): undefined reference to `SDL_GetError'
draw.o:draw.c:(.text+0x1d1): undefined reference to `SDL_GetError'
draw.o:draw.c:(.text+0x244): undefined reference to `__imp_glBegin'
draw.o:draw.c:(.text+0x24b): undefined reference to `__imp_glColor3ub'
draw.o:draw.c:(.text+0x252): undefined reference to `__imp_glVertex2f'
draw.o:draw.c:(.text+0x29f): undefined reference to `__imp_glEnd'
draw.o:draw.c:(.text+0x415): undefined reference to `__imp_glBegin'
draw.o:draw.c:(.text+0x42c): undefined reference to `__imp_glColor3ub'
draw.o:draw.c:(.text+0x447): undefined reference to `__imp_glVertex2f'
draw.o:draw.c:(.text+0x4ef): undefined reference to `__imp_glEnd'
draw.o:draw.c:(.text+0x55b): undefined reference to `__imp_glColor3ub'
draw.o:draw.c:(.text+0x574): undefined reference to `__imp_glBegin'
draw.o:draw.c:(.text+0x580): undefined reference to `__imp_glVertex2f'
draw.o:draw.c:(.text+0x5e4): undefined reference to `__imp_glEnd'
draw.o:draw.c:(.text+0x602): undefined reference to `__imp_glColor3ub'
draw.o:draw.c:(.text+0x638): undefined reference to `__imp_glBegin'
draw.o:draw.c:(.text+0x648): undefined reference to `__imp_glColor3ub'
draw.o:draw.c:(.text+0x664): undefined reference to `__imp_glVertex2f'
draw.o:draw.c:(.text+0x6b8): undefined reference to `__imp_glEnd'
draw.o:draw.c:(.text+0x6e8): undefined reference to `__imp_glBegin'
draw.o:draw.c:(.text+0x6fb): undefined reference to `__imp_glColor3ub'
draw.o:draw.c:(.text+0x717): undefined reference to `__imp_glVertex2f'
draw.o:draw.c:(.text+0x76b): undefined reference to `__imp_glEnd'
draw.o:draw.c:(.text+0x7b5): undefined reference to `__imp_glBegin'
draw.o:draw.c:(.text+0x80d): undefined reference to `__imp_glColor3ub'
draw.o:draw.c:(.text+0x814): undefined reference to `__imp_glVertex2f'
draw.o:draw.c:(.text+0x935): undefined reference to `__imp_glEnd'
draw.o:draw.c:(.text+0xa00): undefined reference to `__imp_glBegin'
draw.o:draw.c:(.text+0xa07): undefined reference to `__imp_glColor3ub'
draw.o:draw.c:(.text+0xa0e): undefined reference to `__imp_glVertex2f'
draw.o:draw.c:(.text+0xb0b): undefined reference to `__imp_glEnd'
draw.o:draw.c:(.text+0xc09): undefined reference to `__imp_glBegin'
draw.o:draw.c:(.text+0xc10): undefined reference to `__imp_glColor3ub'
draw.o:draw.c:(.text+0xc19): undefined reference to `__imp_glVertex2f'
draw.o:draw.c:(.text+0xc20): undefined reference to `__imp_glEnd'
draw.o:draw.c:(.text+0xea7): undefined reference to `__imp_glClear'
draw.o:draw.c:(.text+0xeb2): undefined reference to `__imp_glMatrixMode'
draw.o:draw.c:(.text+0xeb8): undefined reference to `__imp_glLoadIdentity'
draw.o:draw.c:(.text+0xec7): undefined reference to `__imp_glTranslatef'
draw.o:draw.c:(.text+0xf48): undefined reference to `__imp_glBegin'
draw.o:draw.c:(.text+0xf72): undefined reference to `__imp_glColor3ub'
draw.o:draw.c:(.text+0xf8f): undefined reference to `__imp_glVertex2f'
draw.o:draw.c:(.text+0xfba): undefined reference to `__imp_glEnd'
draw.o:draw.c:(.text+0x1089): undefined reference to `SDL_GL_SwapBuffers'
draw.o:draw.c:(.text+0x10c3): undefined reference to `__imp_glColor3ub'
draw.o:draw.c:(.text+0x10d8): undefined reference to `SDL_GetKeyState'
draw.o:draw.c:(.text+0x133d): undefined reference to `SDL_WM_ToggleFullScreen'
draw.o:draw.c:(.text+0x1364): undefined reference to `SDL_PollEvent'
draw.o:draw.c:(.text+0x1385): undefined reference to `SDL_PollEvent'
draw.o:draw.c:(.text+0x13ab): undefined reference to `SDL_SetVideoMode'
draw.o:draw.c:(.text+0x13e1): undefined reference to `SDL_GetError'
serial.o:serial.c:(.text+0x11): undefined reference to `ftdi_init'
serial.o:serial.c:(.text+0x1f): undefined reference to `ftdi_set_interface'
serial.o:serial.c:(.text+0x32): undefined reference to `ftdi_usb_open'
serial.o:serial.c:(.text+0x45): undefined reference to `ftdi_set_baudrate'
serial.o:serial.c:(.text+0x94): undefined reference to `ftdi_get_error_string'
serial.o:serial.c:(.text+0xc7): undefined reference to `ftdi_get_error_string'
serial.o:serial.c:(.text+0x139): undefined reference to `ftdi_write_data'
serial.o:serial.c:(.text+0x233): undefined reference to `ftdi_write_data'
collect2: error: ld returned 1 exit status
make: *** [makefile:6: main] Error 1

【问题讨论】:

  • 我似乎记得 -lwhatever 选项必须在目标文件之后,因为链接器在 Windows 中的工作方式。对于编译器和链接器选项,通常最好将CFLAGSLDFLAGS 分开。
  • 感谢您的输入,我移动了一些东西,所以-lfiles 在对象之后,但仍然得到相同的错误。
  • 您能发布实际运行的完整链接器命令吗?
  • 你指的是我在终端输入make时看到的输出吗?
  • 但是在目标文件之前你还有-l*

标签: c gcc makefile cross-compiling mingw32


【解决方案1】:

当您在 Linux 中链接到 SO 时,例如使用 -lGL,您将直接链接共享对象 libGL.so

但在 Windows 中,当您链接一个 DLL 时,您实际上是在链接一个静态库 libGL.a(在本机 Windows 中为 libGL.lib),其中每个导入的函数都包含一个 thunk。

事实上,共享库和静态库之间的链接器规则是不同的。静态库使用链接器命令行中的顺序进行链接。

TL;DR; 您必须将-l* 放在链接器命令的末尾。此外,将CFLAGSLDFLAGS 分开是一个很好的做法:

CC = x86_64-w64-mingw32-gcc
CFLAGS = -Wall -O2 `sdl-config --cflags`
LDFLAGS = -lmingw32 -lGL -lGLU -lm -lSDL_image -lfftw3 -lftdi1 -mwindows `sdl-config --libs`

OBJECTS = main.o fft.o draw.o table.o serial.o

main : $(OBJECTS)
$(CC) -o $@ $(CFLAGS) $(OBJECTS) $(LDFLAGS)

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

关于WinMain的引用,那是因为你写了-mwindows:那是为了构建一个Windows应用程序,就是以WinMain()而不是main()开头的应用程序。如果您想坚持使用main(),可以改用-mconsole

【讨论】:

  • 啊,好吧,我看到了不同之处。布局看起来也更有条理。我尝试将 -mwindows 更改为 -mconsole 并没有更改错误
  • WinMain 参考上仍然没有进展。我尝试将#include &lt;windows.h&gt; 添加到我在某处阅读的 main.c 文件中。另外,我的 main.c 确实有一行写着int main,所以这会导致一些问题吗?我需要对 cygwin 做些什么来让它寻找别的东西吗?
  • 啊!您正在使用 SDL,因此您遇到了臭名昭著的 SDL_main 问题。您可以尝试使用SDL_main.a 链接或在main 函数之前添加#undef main
  • 嘿! #ifdef main # undef main #endif /* main */ 工作!
  • 现在我有了我的 .exe!但是当我尝试运行它时,我得到了几个丢失的 .dll 错误,包括 cygftdi-1.2.dll cygGLU-1.dll cygfftw3-3.dll cygGL-1.dll
【解决方案2】:

我在顶部切换了objects和cflags,但是忘记在里面切换objects和cflags

main : $(OBJECTS) $(CC) $(OBJECTS) $(CFLAGS) -o main

现在我只得到一个未定义的 WinMain 引用

$ make
x86_64-w64-mingw32-gcc -Wall -O2 -lmingw32 -lm -lGL -lGLU -lSDL_image - 
lfftw3 -lftdi1 -mwindows `sdl-config --cflags --libs` -c main.c
x86_64-w64-mingw32-gcc -Wall -O2 -lmingw32 -lm -lGL -lGLU -lSDL_image - 
lfftw3 -lftdi1 -mwindows `sdl-config --cflags --libs` -c fft.c
x86_64-w64-mingw32-gcc -Wall -O2 -lmingw32 -lm -lGL -lGLU -lSDL_image - 
lfftw3 -lftdi1 -mwindows `sdl-config --cflags --libs` -c draw.c
x86_64-w64-mingw32-gcc -Wall -O2 -lmingw32 -lm -lGL -lGLU -lSDL_image - 
lfftw3 -lftdi1 -mwindows `sdl-config --cflags --libs` -c table.c
x86_64-w64-mingw32-gcc -Wall -O2 -lmingw32 -lm -lGL -lGLU -lSDL_image - 
lfftw3 -lftdi1 -mwindows `sdl-config --cflags --libs` -c serial.c
x86_64-w64-mingw32-gcc main.o fft.o draw.o table.o serial.o -Wall -O2 - 
lmingw32 -lm -lGL -lGLU -lSDL_image -lfftw3 -lftdi1 -mwindows `sdl-config -- 
cflags --libs` -o main
/usr/x86_64-w64-mingw32/sys- 
root/mingw/lib/../lib/libmingw32.a(lib64_libmingw32_a-crt0_c.o): In function 
`main':
/usr/src/debug/mingw64-x86_64-runtime-5.0.3-1/crt/crt0_c.c:18: undefined 
reference to `WinMain'
collect2: error: ld returned 1 exit status
make: *** [makefile:6: main] Error 1

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-07-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-04-09
    相关资源
    最近更新 更多