Как выполнить кросс-компиляцию из Linux в 32-битный исполняемый файл Windows - PullRequest
0 голосов
/ 22 мая 2018

Для контекста я пытаюсь скомпилировать исходный код в 32-битный исполняемый файл для Windows, используя машину с Linux.Я использую текущий mingw-w64 через apt-get.Вот проект, который я пытаюсь скомпилировать ftp: //ftp.thegpm.org/projects/tandem/source.В частности, zip-файлы 17-02-01 содержат интересующий меня источник. Моя первая попытка состояла в том, чтобы просто отредактировать с помощью Makefile_ubuntu в tandem-linux и заменить gcc на тот, который предоставлен mingw, и исправить заголовок.проблемы со ссылками, возникающие при добавлении #includes к .cpp файлам, которые выдавали ошибки.Супер хакерский.Может кто-нибудь показать мне более яркий путь?

Вот этот make-файл, который я использую:

#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)

А вот и ошибка (ы):

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

1 Ответ

0 голосов
/ 22 мая 2018

Вы (неправильно) связываетесь с /usr/lib/x86_64-linux-gnu/libexpat.a, который является библиотекой Linux (в формате ELF ).Вам нужно получить какую-то версию для Windows.

BTW -L/usr/lib/x86_64-linux-gnu/libexpat.a неверно.Поскольку -L должен давать каталог , а не библиотеку для связи

Наконец, в последних версиях Windows может быть WSL , который может быть полезен вам (вам)Я скомпилирую Linux, в основном статически связанный, исполняемый, и он может работать в командной строке в Windows).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...