Кросс-компиляция приложения на основе Qt с внешней библиотекой - PullRequest
0 голосов
/ 16 декабря 2018

У меня есть приложение на основе Qt, написанное на C ++, и я использую библиотеку fuzzylite 6.0 , и я хочу связать ее статически.

Компиляция и выполнениеработать безупречно на моем компьютере с Linux.Тем не менее, я также хочу собрать для Windows.Поэтому я построил MXE набор инструментов и fuzzylite для Windows, используя MXE (MXE_TARGETS=x86_64-w64-mingw32.static).

Процесс компиляции работает нормально, за исключением нескольких предупреждений, поступающих из внешней библиотеки (я полагаю, они используютнекоторые MSVC #pragma s, чтобы отключить их, но они все еще отображаются с MinGW).

Однако полученный исполняемый файл PE абсолютно ничего не делает на компьютере с Windows x86_64.Никаких ошибок и ничего не появляется, когда я запускаю исполняемый файл.

Когда я компилирую без fuzzylite (и без кода, связанного с fuzzylite), он работает, что заставляет меня думать, что есть проблема во время сборки моего приложения илиfuzzylite, но я не смог найти решение.


Вот конкретные шаги, которые я предпринял:

  • Установка набора инструментов MXE Qt:

    $ git clone https://github.com/mxe/mxe.git /usr/local/src/mxe
    $ cd /usr/local/src/mxe/
    $ make MXE_TARGETS=x86_64-w64-mingw32.static PREFIX=/usr/local qtbase
    
  • Создание fuzzylite:

    Я изменил build.sh, чтобы использовать MXE-версию cmake после прочтения этого ответа , так как он автоматически используетсоответствующий файл цепочки инструментов для Windows.

    $ git clone https://github.com/fuzzylite/fuzzylite.git /usr/local/src/fuzzylite
    $ cd /usr/local/src/fuzzylite/fuzzylite
    $ sed -i 's/cmake\b/\/usr\/local\/bin\/x86_64-w64-mingw32.static-cmake/g' build.sh
    $ /usr/local/src/fuzzylite/fuzzylite/build.sh all
    

    fuzzylite также имеет файл build.bat, но я считаю, что он может быть выполнен только внутри среды Windows.

  • Установка фуззилита:

    $ cp /usr/local/src/fuzzylite/fuzzylite/release/bin/lib* /usr/local/lib/release/
    $ cp /usr/local/src/fuzzylite/fuzzylite/debug/bin/lib* /usr/local/lib/debug/
    
  • Сборка приложения:

    $ x86_64-w64-mingw32.static-qmake-qt5
    $ make
    

Вот мой .pro file (проект называется code):

#-------------------------------------------------
#
# Project created by QtCreator 2018-11-19T08:47:31
#
#-------------------------------------------------

QT       += core gui

greaterThan(QT_MAJOR_VERSION, 4): QT += widgets

TARGET = code
TEMPLATE = app

# The following define makes your compiler emit warnings if you use
# any feature of Qt which has been marked as deprecated (the exact warnings
# depend on your compiler). Please consult the documentation of the
# deprecated API in order to know how to port your code away from it.
DEFINES += QT_DEPRECATED_WARNINGS

# You can also make your code fail to compile if you use deprecated APIs.
# In order to do so, uncomment the following line.
# You can also select to disable deprecated APIs only up to a certain version of Qt.
#DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0x060000    # disables all the APIs deprecated before Qt 6.0.0

CONFIG += c++11

SOURCES += \
        main.cpp \
        mainwindow.cpp \
        analyzer.cpp \
        overlay.cpp \
        ridgeendingengine.cpp \
        minutiaengine.cpp \
        reversetrapezoid.cpp

HEADERS += \
        mainwindow.hpp \
        analyzer.hpp \
        overlay.hpp \
        ridgeendingengine.hpp \
        minutiaengine.hpp \
        reversetrapezoid.hpp

# Default rules for deployment.
qnx: target.path = /tmp/$${TARGET}/bin
else: unix:!android: target.path = /opt/$${TARGET}/bin
!isEmpty(target.path): INSTALLS += target

win32:CONFIG(release, debug|release): LIBS += -L/usr/local/lib/release/ -lfuzzylite-static
else:win32:CONFIG(debug, debug|release): LIBS += -L/usr/local/lib/debug/ -lfuzzylite-static
else:unix: LIBS += -L/usr/local/lib/ -lfuzzylite-static

INCLUDEPATH += /usr/local/include
DEPENDPATH += /usr/local/include

win32-g++:CONFIG(release, debug|release): PRE_TARGETDEPS += /usr/local/lib/release/libfuzzylite-static.a
else:win32-g++:CONFIG(debug, debug|release): PRE_TARGETDEPS += /usr/local/lib/debug/libfuzzylite-static.a
else:win32:!win32-g++:CONFIG(release, debug|release): PRE_TARGETDEPS += /usr/local/lib/release/fuzzylite-static.lib
else:win32:!win32-g++:CONFIG(debug, debug|release): PRE_TARGETDEPS += /usr/local/lib/debug/fuzzylite-static.lib
else:unix: PRE_TARGETDEPS += /usr/local/lib/libfuzzylite-static.a

Образец предупреждений, сгенерированных во время сборкии fuzzylite, и мое заявление:

In file included from /usr/local/src/fuzzylite/fuzzylite/./fl/Headers.h:33:0,
                 from /usr/local/src/fuzzylite/fuzzylite/src/main.cpp:17:
/usr/local/src/fuzzylite/fuzzylite/./fl/Exception.h:45:0: warning: ignoring #pragma warning  [-Wunknown-pragmas]
 #pragma warning (push)
 ^
/usr/local/src/fuzzylite/fuzzylite/./fl/Exception.h:46:0: warning: ignoring #pragma warning  [-Wunknown-pragmas]
 #pragma warning (disable:4275)
 ^
/usr/local/src/fuzzylite/fuzzylite/./fl/Exception.h:51:0: warning: ignoring #pragma warning  [-Wunknown-pragmas]
 #pragma warning (pop)
 ^
In file included from /usr/local/src/fuzzylite/fuzzylite/./fl/term/Term.h:22:0,
                 from /usr/local/src/fuzzylite/fuzzylite/./fl/factory/ConstructionFactory.h:119,
                 from /usr/local/src/fuzzylite/fuzzylite/./fl/factory/ActivationFactory.h:22,
                 from /usr/local/src/fuzzylite/fuzzylite/./fl/Headers.h:55,
                 from /usr/local/src/fuzzylite/fuzzylite/src/main.cpp:17:
/usr/local/src/fuzzylite/fuzzylite/./fl/Operation.h:993:24: warning: inline function 'static std::__cxx11::string fl::Operation::str(T, int, std::ios_base::fmtflags) [with T = const std::__cxx11::basic_string<char>&; std::__cxx11::string = std::__cxx11::basic_string<char>; std::ios_base::fmtflags = std::_Ios_Fmtflags]' declared as  dllimport: attribute ignored [-Wattributes]
     inline std::string Operation::str(const std::string& x, int decimals,
                        ^
/usr/local/src/fuzzylite/fuzzylite/./fl/Operation.h:1012:24: warning: inline function 'static std::__cxx11::string fl::Operation::join(const std::vector<T>&, const string&) [with T = std::__cxx11::basic_string<char>; std::__cxx11::string = std::__cxx11::basic_string<char>]' declared as  dllimport: attribute ignored [-Wattributes]
     inline std::string Operation::join(const std::vector<std::string>& x,
                        ^
/usr/local/src/fuzzylite/fuzzylite/./fl/Operation.h:1038:24: warning: inline function 'static std::__cxx11::string fl::Operation::join(int, const string&, T, ...) [with T = float; std::__cxx11::string = std::__cxx11::basic_string<char>]' declared as  dllimport: attribute ignored [-Wattributes]
     inline std::string Operation::join(int items, const std::string& separator,
                        ^
/usr/local/src/fuzzylite/fuzzylite/./fl/Operation.h:1054:24: warning: inline function 'static std::__cxx11::string fl::Operation::join(int, const string&, T, ...) [with T = const char*; std::__cxx11::string = std::__cxx11::basic_string<char>]' declared as  dllimport: attribute ignored [-Wattributes]
     inline std::string Operation::join(int items, const std::string& separator, const char* first, ...) {
                        ^
...