Link dylib в проекте macOs QT - PullRequest
       2

Link dylib в проекте macOs QT

0 голосов
/ 17 февраля 2019

Я попробовал простой dylib в macOS и скомпилировал с g ++.Я сделал небольшой пример для тестирования библиотеки, она отлично работает.Теперь я сделал простое приложение QT, связал библиотеку и добавил заголовок к mainwindow.cpp, и у меня всегда получалось сообщение об ошибке Причина: изображение не найдено

Я читаю в Интернете, а также некоторые другие случаи здесь, но всеосновывается на пути. Я думаю, что это не проблема пути.Поскольку я внес все изменения, я прочитал во всех случаях, а также скопировал библиотеку во все необходимые папки, такие как папка проекта, папка сборки.Ничего не помогает.

Я думаю, что QT не может работать с библиотекой, и я пропустил некоторый необходимый код, например, для инициализации или экспорта.Так что проблема скорее в dylib, а не в значениях QT или Paths.

Может быть, кто-то может помочь мне здесь?

Я пытался:

INCLUDEPATH += $$PWD/mylib
DEPENDPATH += $$PWD/mylib
macx: LIBS += -L$$PWD/mylib/ -lmylib

Я попытался скопировать lib в папку build, а также в исполняемую папку.

Также отредактировано:

/⁨Users⁩/⁨ingoforster⁩/Documents⁩/Development⁩/Playground⁩/TestGround⁩/mylib:/Users/ingoforster/Qt/5.9.1/clang_64/lib 
in Project settings DYLD_LIBRARY_PATH 
Set also to DYLD_FRAMEWORK_PATH

Cpp

#include "mylib.hpp"

char *mMessage(void) {
    return "Ein sonniger Tag";
}

header

#include <stdio.h>
#include <iostream>

using namespace std;

char *mMessage(void);

скомпилировано с g ++ -std = c ++ 0x -verbose -dynamiclib -o libmylib.dylib mylib.cpp

Образец

#include "mylib.hpp"

int main(void){

    char* Ingo = mMessage();
    std::cout << mMessage();

}

, скомпилированный с помощью g ++ -std = c ++ 0x test.cpp -L./ -lmylib

Фактический результат - образец работает идеально.Но в QT я получил:

dyld: библиотека не загружена: libmylib.dylib Ссылка на:/ TestGround Причина: изображение не найдено 10:09:05: Программа неожиданно завершила работу.10:09:05: Процесс был принудительно завершен.

Ответы [ 2 ]

0 голосов
/ 21 февраля 2019

После некоторого жесткого исследования и бегства в неправильном направлении с данными ответами здесь я обнаружил, что QTCreator будет делать все по-своему:

Файл QTCreator Pro должен содержать:

macx: LIBS += -L$$PWD/mylib/ -lmylib
INCLUDEPATH += $$PWD/mylib
DEPENDPATH += $$PWD/mylib

MediaFiles.files += mylib/libmylib.dylib
MediaFiles.path = Contents/MacOS
QMAKE_BUNDLE_DATA += MediaFiles
0 голосов
/ 18 февраля 2019

/Users/ingoforster/Documents/Development/Playground/build-TestGround-Desktop_Qt_5_9_1_clang_64bit-Debug/TestGround.app/Contents/MacOS/TestGround, по-видимому, связан компиляцией с кодом вашей библиотеки, но, возможно, формально не был установлен в исполняемый файл.macdeployqt обычно решает эту проблему.Вы также можете сделать это вручную с помощью otool и install_name_tool:

otool -L /path/to/executable

. Здесь будут перечислены установленные пути к используемым dylibs.Вы увидите ваш dylib, то есть "/old/path/to/libmylib.dylib"

install_name_tool -change /old/path/to/libmylib.dylib /new/path/to/libmylib.dylib /path/to/executable

Обычно в .app dylib устанавливается наподкаталог в папке .app.

Application.app/
    Contents/
        MacOS/
            executable
        Frameworks/
            libmylib.dylib

С помощью install_name_tool вы можете указать dylib относительно пути к исполняемому файлу, чтобы сделать приложение переносимым.install_name_tool -change /old/path/to/libmylib.dylib @executable_path/../Frameworks/libmylib.dylib /path/to/executable

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