Кросс-компиляция в Linux для Windows с использованием ссылок MXE — GSL?

У меня есть проект C ++, разработанный для Linux, который я хотел бы передать своим коллегам по Windows, предоставив им исполняемый файл.

Я искал проблему и обнаружил, что одним из способов может быть компиляция с помощью i586-mingw32msvc-g++ вместо g++, Я также понял, что это решение отследит проблему связанных библиотек, которые необходимо перестроить, я надеялся решить эту проблему с помощью сценария MXE (http://mxe.cc/).

Мой make-файл (я новичок в этом, предложения приветствуются):

#main.make
CC = i586-mingw32msvc-g++
CFLAGS = -Wall -O2
LDFLAGS =
SOURCES =  <list of cpp files>
LDLIBS =  -L/usr/i586-mingw32msvc/lib/ -llapack -lblas -lgsl -lgslcblas -lm -lmingw32
OBJECTS=$(SOURCES:.cpp=.o)
EXECUTABLE = main_simple.exe

all: $(SOURCES) $(EXECUTABLE)

$(EXECUTABLE): $(OBJECTS)
$(CC) $(LDFLAGS) $(OBJECTS) -o $@ $(LDLIBS)

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

clean:
rm *.o main_simple.exe ./Output/* ./Output/*/* ./Output/*/*/*

Если я попытаюсь make Я получаю кучу ошибок, связанных с gsl, таких как:

 utilities.o:utilities.cpp:(.text+0x2d1): undefined reference to `_gsl_matrix_alloc'
utilities.o:utilities.cpp:(.text+0x2dc): undefined reference to `_gsl_vector_alloc'
....
utilities.o:utilities.cpp:(.text+0x42e): undefined reference to `_gsl_matrix_free'
utilities.o:utilities.cpp:(.text+0x70f): undefined reference to `_gsl_fit_linear'
utilities.o:utilities.cpp:(.text+0x722): undefined reference to `_gsl_stats_correlation'
collect2: ld returned 1 exit status

Означает ли это, что компилятор действительно находит библиотеки, которые, как я думал, я создал с помощью MXE? Что я могу сделать?

В качестве альтернативы, будет cmake быть более чистым решением? Могу ли я использовать его для создания .exe файл с моей машины Linux? Или в этом случае я должен попросить моих коллег перекомпилировать на их машине?

Спасибо за любую помощь, которую вы можете оказать мне!

2

Решение

Проблема в том, что в настоящее время (ноябрь 2016 г.) компиляция gsl в качестве разделяемой библиотеки деактивирована в mxe. Вот почему ваш компоновщик не может найти ссылки на эти функции, и вы получаете эту ошибку.

Теперь вы можете скомпилировать gsl самостоятельно, используя кросс-компилятор mxe, или активировать общую сборку (посмотрите на src / gsl.mk в исходном коде mxe).

Так как мне нужен gsl для моего собственного проекта, я попытался включить совместную сборку в запросе Pull к mxe (https://github.com/mxe/mxe/pull/1568). Вы можете попытать счастья с этой модификацией, она сработала для меня.

1

Другие решения

Чтобы расстроиться, я бы предложил следующее

  1. Предоставить полный «дамп сборки» фактического вызываемого компилятора и вызываемых флагов

  2. предоставить полный журнал ошибок

  3. используйте некоторые бинарные инструменты исследования, такие как ‘objdump’ (возможно, он будет находиться в папке mingw, созданной MXE под чем-то вроде ‘i686-pc-mingw32-objdump’), чтобы заглянуть в библиотеки, которые вы создали, и посмотреть, содержат ли они пропущенные символы ,

Другими словами, если вы создали библиотеку, в которой должна быть функция `_gsl_matrix_alloc ‘, то посмотрите на созданную вами библиотеку, чтобы убедиться, что она там есть. если вы не знаете, какая библиотека должна содержать эту функцию, то выполните некоторую работу с оболочкой, чтобы найти все библиотеки, ищущие это имя символа.

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

И, наконец, что может помочь вам больше всего, это найти другую программу, которая использует те же библиотеки, что и ваша, и которую вы знаете, кросс-компилировать в окна, а затем скопировать то, что они сделали. Хороший источник таких программ — зайти на mxe.cc и посмотреть список «проектов, использующих mxe» на своих веб-страницах, посмотреть, использует ли какая-либо из них GSL, а затем посмотреть, как они это сделали. Другой способ найти проекты — это искать проекты с открытым исходным кодом, используя GSL, и посмотреть, рекламируют ли они бинарные загрузки Windows на своей главной веб-странице. Если это так, вероятно, они используют кросс-компиляцию.

удачи!

0

По вопросам рекламы [email protected]