简体   繁体   中英

How to cross compile from Linux to 32-bit Windows executable

For context, I'm trying to compile source to a 32-bit executable for Windows using a Linux machine. I'm using the current mingw-w64 via apt-get . Here's the project I'm trying to compile ftp://ftp.thegpm.org/projects/tandem/source . More specifically the 17-02-01 zip files contain the source I'm interested in. My first attempt was to just edit with the Makefile_ubuntu under the tandem-linux and swap out the gcc with the one provided by mingw and fix header reference issues that cropped up by adding #includes to .cpp files that threw errors. Super hacky. Can someone show me a brighter path?

Here's the makefile I'm using:

#makefile for c++ programs
#change the name of the executable to use for "any" project

EXECUTABLE = ../bin/tandem.exe
#EXECUTABLE = ../bin/p3.exe
LINKCC = $(CXX)

#CXXFLAGS denotes flags for the C++ compiler

CXX = /usr/bin/i686-w64-mingw32-g++-win32

#uncomment this line if you are using gcc 4.x
CXXFLAGS = -m32 -std=gnu++11
#CXXFLAGS = -w -O2 -DGCC4_3
#CXXFLAGS = -w -O2 -DGCC4_3 -DX_P3

#ubuntu 64 bit version
#LDFLAGS = -L/usr/lib/x86_64-linux-gnu/libexpat.a
LDFLAGS = -lpthread -lm -L/usr/lib/x86_64-linux-gnu/libexpat.a
#LDFLAGS = -lpthread -L/usr/lib -lm -lexpat

SRCS := $(wildcard *.cpp)
OBJS := $(patsubst %.cpp,%.o,$(wildcard *.cpp))
DEPS := $(patsubst %.o,%.d,$(OBJS))


all: $(EXECUTABLE)

#define the components of the program, and how to link them
#these components are defined as dependencies; that is they must be up-to-date before the code is linked

$(EXECUTABLE): $(DEPS) $(OBJS)
        $(LINKCC) $(CXXFLAGS) -o $(EXECUTABLE) $(OBJS) $(LDFLAGS)

#specify the dep files depend on the cpp files

%.d: %.cpp
        $(CXX) -M $(CXXFLAGS) $< > $@
        $(CXX) -M $(CXXFLAGS) $< | sed s/\\.o/.d/ > $@



clean:
        -rm $(OBJS) $(EXECUTABLE) $(DEPS) *~

explain:
        @echo "The following info represents the program:"
        @echo "Final exec name: $(EXECUTABLE)"
        @echo "Source files:       $(SRCS)"
        @echo "Object files:       $(OBJS)"
        @echo "Dep files:          $(DEPS)"

depend: $(DEPS)
        @echo "Deps are now up-to-date."

-include $(DEPS)

And here is the error(s):

sudo make -f Makefile_ubuntu
    /usr/bin/i686-w64-mingw32-g++-win32  -m32 -std=gnu++11  -o ../bin/tandem.exe tandem.o p3mprocess.o saxmzdatahandler.o mspectrumcondition.o masscalc.o mprocess.o mreport.o mscore_tandem.o loadmspectrum.o mplugin.o msequenceserver.o saxtaxhandler.o msequencecollection.o mscore.o mrefine.o xmltaxonomy.o mbiomlreport.o saxtandeminputhandler.o saxhandler.o msequtilities.o base64.o saxmodhandler.o mtermmods.o xmlparameter.o saxsaphandler.o saxmzxmlhandler.o saxmzmlhandler.o mxxcleavage.o p3msequenceserver.o mzid_report.o saxbiomlhandler.o p3.o mpmods.o saxgamlhandler.o stdafx.o MSNumpress.o mpam.o -lpthread -lm -L/usr/lib/x86_64-linux-gnu/libexpat.a 
    saxhandler.o:saxhandler.cpp:(.text+0x100): undefined reference to `XML_ParserCreate'
    saxhandler.o:saxhandler.cpp:(.text+0x11d): undefined reference to `XML_SetUserData'
    saxhandler.o:saxhandler.cpp:(.text+0x13b): undefined reference to `XML_SetElementHandler'
    saxhandler.o:saxhandler.cpp:(.text+0x151): undefined reference to `XML_SetCharacterDataHandler'
    saxhandler.o:saxhandler.cpp:(.text+0x1cf): undefined reference to `XML_ParserFree'
    saxhandler.o:saxhandler.cpp:(.text+0x344): undefined reference to `XML_Parse'
    saxhandler.o:saxhandler.cpp:(.text+0x37f): undefined reference to `XML_Parse'
    saxhandler.o:saxhandler.cpp:(.text+0x3bd): undefined reference to `XML_GetErrorCode'
    saxhandler.o:saxhandler.cpp:(.text+0x3d4): undefined reference to `XML_GetCurrentLineNumber'
    collect2: error: ld returned 1 exit status
    Makefile_ubuntu:33: recipe for target '../bin/tandem.exe' failed
    make: *** [../bin/tandem.exe] Error 1

You are (incorrectly) linking with /usr/lib/x86_64-linux-gnu/libexpat.a which is a Linux library (in ELF format). You need to get some Windows version of it.

BTW -L/usr/lib/x86_64-linux-gnu/libexpat.a is incorrect. Since -L should give a directory not a library to link

At last, recent versions of Windows might have WSL which could be useful to you (you'll compile a Linux, mostly statically linked, executable, and it might run on the command line on Windows).

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM