Welcome to OGeek Q&A Community for programmer and developer-Open, Learning and Share
Welcome To Ask or Share your Answers For Others

Categories

0 votes
2.7k views
in Technique[技术] by (71.8m points)

How to crosscompile C, C++ and assebly source file from Linux-64bit to Windows-32it?

I have the following files in my project:

  • file.s and STR_ARR.s as x86 assembly source files.
  • file.c and main.c as C source files.
  • directoryListing.cpp as C++ source files.

I am working on a 64 bit distribution of arch and I need to compile these file both for linux and windows 32 bit. Right now the linux part of the project works fine, this is my makefile:

C_OPTIONS = -m32 -fPIC


build-elf: STR_ARR.elf.o directoryListing.elf.o main.elf.o file.s.elf.o file.elf.o
    $(CC) $(C_OPTIONS) STR_ARR.elf.o directoryListing.elf.o file.s.elf.o file.elf.o main.elf.o -o $(OUTPUT_DIR)/$(elfC_NAME).elf -static -lstdc++

main.elf.o: main.c
    $(CC) $(C_OPTIONS) -c main.c -o main.elf.o

directoryListing.elf.o: directoryListing.cpp directoryListing.hpp
    $(CXX) $(C_OPTIONS) -std=c++17 -c directoryListing.cpp -o directoryListing.elf.o

STR_ARR.elf.o: STR_ARR.s STR_ARR.h
    $(CC) $(C_OPTIONS) -c STR_ARR.s -o STR_ARR.elf.o

file.elf.o: file.c file.h
    $(CC) $(C_OPTIONS) -c file.c -o file.elf.o

file.s.elf.o: file.s file.s.h
    $(CC) $(C_OPTIONS) -c file.s -o file.s.elf.o

I am trying to cross compile the project using mingw32 and this make file:

CXX_WIN = i686-w64-mingw32-g++
CC_WIN = i686-w64-mingw32-gcc
C_OPTIONS = -m32 -fPIC


build-exe: STR_ARR.exe.o directoryListing.exe.o main.exe.o file.s.exe.o file.exe.o
    $(CC_WIN) $(C_OPTIONS) STR_ARR.exe.o directoryListing.exe.o file.s.exe.o file.exe.o main.exe.o -o $(OUTPUT_DIR)/$(exeC_NAME).exe -static -lstdc++

main.exe.o: main.c
    $(CC_WIN) $(C_OPTIONS) -c main.c -o main.exe.o

directoryListing.exe.o: directoryListing.cpp directoryListing.hpp
    $(CXX_WIN) $(C_OPTIONS) -std=c++17 -c directoryListing.cpp -o directoryListing.exe.o

STR_ARR.exe.o: STR_ARR.s STR_ARR.h
    $(CC_WIN) $(C_OPTIONS) -c STR_ARR.s -o STR_ARR.exe.o

file.exe.o: file.c file.h
    $(CC_WIN) $(C_OPTIONS) -c file.c -o file.exe.o

file.s.exe.o: file.s file.s.h
    $(CC_WIN) $(C_OPTIONS) -c file.s -o file.s.exe.o

But no matter what I do the linker seems to be unable to find the libc functions and the SA_* functions in STR_ARR.s.

I have tried building a shared library, explicitly linking -lc and and -lcrt and reinstalling mingw but nothing seems to work.

Here's the output of calling make:

$ make build-exe
i686-w64-mingw32-gcc -m32 -fPIC -c STR_ARR.s -o STR_ARR.exe.o
i686-w64-mingw32-g++ -m32 -fPIC -std=c++17 -c directoryListing.cpp -o directoryListing.exe.o
i686-w64-mingw32-gcc -m32 -fPIC -c main.c -o main.exe.o
i686-w64-mingw32-gcc -m32 -fPIC -c file.s -o file.s.exe.o
i686-w64-mingw32-gcc -m32 -fPIC -c file.c -o file.exe.o
i686-w64-mingw32-gcc -m32 -fPIC STR_ARR.exe.o directoryListing.exe.o file.s.exe.o file.exe.o main.exe.o -o ../target/classes/.exe -static -lstdc++
/usr/lib/gcc/i686-w64-mingw32/10.2.0/../../../../i686-w64-mingw32/bin/ld: STR_ARR.exe.o:fake:(.text+0x6): undefined reference to `malloc'
/usr/lib/gcc/i686-w64-mingw32/10.2.0/../../../../i686-w64-mingw32/bin/ld: STR_ARR.exe.o:fake:(.text+0x4f): undefined reference to `free'
/usr/lib/gcc/i686-w64-mingw32/10.2.0/../../../../i686-w64-mingw32/bin/ld: STR_ARR.exe.o:fake:(.text+0x66): undefined reference to `free'
/usr/lib/gcc/i686-w64-mingw32/10.2.0/../../../../i686-w64-mingw32/bin/ld: STR_ARR.exe.o:fake:(.text+0xa4): undefined reference to `realloc'
/usr/lib/gcc/i686-w64-mingw32/10.2.0/../../../../i686-w64-mingw32/bin/ld: STR_ARR.exe.o:fake:(.text+0xee): undefined reference to `strlen'
/usr/lib/gcc/i686-w64-mingw32/10.2.0/../../../../i686-w64-mingw32/bin/ld: STR_ARR.exe.o:fake:(.text+0xf8): undefined reference to `malloc'
/usr/lib/gcc/i686-w64-mingw32/10.2.0/../../../../i686-w64-mingw32/bin/ld: STR_ARR.exe.o:fake:(.text+0x117): undefined reference to `strcpy'
/usr/lib/gcc/i686-w64-mingw32/10.2.0/../../../../i686-w64-mingw32/bin/ld: directoryListing.exe.o:directoryListing.cpp:(.text+0x1b): undefined reference to `SA_new'
/usr/lib/gcc/i686-w64-mingw32/10.2.0/../../../../i686-w64-mingw32/bin/ld: directoryListing.exe.o:directoryListing.cpp:(.text+0x121): undefined reference to `SA_add'
/usr/lib/gcc/i686-w64-mingw32/10.2.0/../../../../i686-w64-mingw32/bin/ld: directoryListing.exe.o:directoryListing.cpp:(.text+0x13f): undefined reference to `SA_free'
/usr/lib/gcc/i686-w64-mingw32/10.2.0/../../../../i686-w64-mingw32/bin/ld: directoryListing.exe.o:directoryListing.cpp:(.text+0x14a): undefined reference to `SA_new'
/usr/lib/gcc/i686-w64-mingw32/10.2.0/../../../../i686-w64-mingw32/bin/ld: file.s.exe.o:fake:(.text+0x26): undefined reference to `remove'
/usr/lib/gcc/i686-w64-mingw32/10.2.0/../../../../i686-w64-mingw32/bin/ld: file.s.exe.o:fake:(.text+0x2c): undefined reference to `strcpy'
/usr/lib/gcc/i686-w64-mingw32/10.2.0/../../../../i686-w64-mingw32/bin/ld: file.s.exe.o:fake:(.text+0x39): undefined reference to `strcat'
/usr/lib/gcc/i686-w64-mingw32/10.2.0/../../../../i686-w64-mingw32/bin/ld: file.s.exe.o:fake:(.text+0x3e): undefined reference to `remove'
/usr/lib/gcc/i686-w64-mingw32/10.2.0/../../../../i686-w64-mingw32/bin/ld: file.exe.o:file.c:(.text+0x12d): undefined reference to `SA_free'
/usr/lib/gcc/i686-w64-mingw32/10.2.0/../../../../i686-w64-mingw32/bin/ld: file.exe.o:file.c:(.text+0x1ae): undefined reference to `SA_new'
/usr/lib/gcc/i686-w64-mingw32/10.2.0/../../../../i686-w64-mingw32/bin/ld: file.exe.o:file.c:(.text+0x289): undefined reference to `SA_move'
/usr/lib/gcc/i686-w64-mingw32/10.2.0/../../../../i686-w64-mingw32/bin/ld: file.exe.o:file.c:(.text+0x448): undefined reference to `calculateTimeToCharge_ASM'
/usr/lib/gcc/i686-w64-mingw32/10.2.0/../../../../i686-w64-mingw32/bin/ld: file.exe.o:file.c:(.text+0x4a6): undefined reference to `deleteFiles_ASM'
collect2: error: ld returned 1 exit status
make: *** [makefile:30: build-exe] Error 1

与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…
Welcome To Ask or Share your Answers For Others

1 Reply

0 votes
by (71.8m points)
等待大神解答

与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…
OGeek|极客中国-欢迎来到极客的世界,一个免费开放的程序员编程交流平台!开放,进步,分享!让技术改变生活,让极客改变未来! Welcome to OGeek Q&A Community for programmer and developer-Open, Learning and Share
Click Here to Ask a Question

1.4m articles

1.4m replys

5 comments

57.0k users

...