Создание библиотеки, которая использует символы из приложения - PullRequest
1 голос
/ 27 июня 2019

У меня есть приложение, созданное с помощью QtCreator (QT5.13), которое состоит из приложения MyApp и, скажем, одной динамической библиотеки MyLib. Эта динамическая библиотека также вызывает функции, определенные в приложении.

1) При правильном значении INCLUDEPATH и файлах заголовков мой проект компилируется и выполняется на платформе Windows с использованием MSVC.

2) Я перенес проект на Unix Ubuntu (QT5.13) также с успехом, но с незначительными изменениями в .PRO, в основном добавив «-r dynamic» и удалив прямую ссылку « LIBS + = $$ PWD /lib/MyApp.lib"

3) Теперь я пошел, чтобы скомпилировать мой проект на платформе Windows с Mingw (mingw730_64). Приложение компилируется и генерируется исполняемый файл. Но я получаю ошибку с компоновщиком MyLib. Например:

ошибка: неопределенная ссылка на `__imp__ZN13FBSFBaseModelC2Ev '

и для всех символов, присутствующих в MyApp, которые вызываются MyLib.

Я явно не понимаю процесс связи с платформами и как компилятору удается разрешать символы статически или динамически. Спасибо за помощь

На Windows и Mingw я пробовал без GCC: QMAKE_LFLAGS + = -r динамический получить неопределенные ссылки.

Я пытался использовать " GCC: QMAKE_LFLAGS + = -r dynamic ", но, похоже, winGW

не распознается

MyApp.PRO, которое работает для windows / MVSC:

    TARGET    =    MyApp
    TEMPLATE    =    app
    LIBS    +=    -L$$PWD/lib    -lOtherLib
    GCC:QMAKE_LFLAGS += -r dynamic

MyLib.PRO для Linux и GCC, который работает:

    TARGET    =    MyLib
    TEMPLATE    =    lib
    WIN32:LIBS    +=    $$PWD/lib/MyApp.lib

1 Ответ

0 голосов
/ 28 июня 2019

Как уже упоминалось в комментариях, наличие библиотеки, требующей символов из exe-файла, является обратным.

В любом случае.В Linux он работает с -rdynamics, поскольку формат ELF в Linux может поддерживать неопределенные символы.

В Windows вы должны предоставить компоновщику подсказки, где найти символы.Таким образом, у вас никогда не будет опции -rdynamics.Вы предоставляете файл .lib, который описывает, какие символы будут доступны в исполняемом файле.

Именно поэтому WIN32:LIBS += $$PWD/lib/MyApp.lib делает его работающим для MSVC.

Однако MinGW нераспознает .lib файлы, но вместо этого использует .a файлы.Поэтому вам нужно заменить $$PWD/lib/MyApp.lib на $$PWD/lib/MyApp.a.

Обратите внимание, что если у вас не сгенерировано MyApp.a при компиляции MyApp.exe, это может означать 2 вещи:

  1. Вам нужно добавить -Wl,--out-implib=MyApp.a к команде ссылки вашего exe.
  2. Вам нужно пометить экспортированные символы с помощью __declspec(dllexport) в коде вашего приложения.
...