Как проще всего ссылаться на библиотеки в проектах Qt?

У меня есть два проекта приложения Qt4 Gui и один проект библиотеки shared, на все из которых есть ссылки в файле .pro с шаблоном «subdirs». Итак, это как:

  • exampleapp.pro
    • app1.pro
    • app2.pro
    • Sharedlib.pro

Теперь я хочу сделать ссылку на sharedlib из app1 и app2, чтобы каждый раз, когда я запускаю app1.exe, мне не приходилось вручную копировать sharedlib.dll из его собственной папки в папку app1.exe.

Я мог бы установить переменную среды PATH в окне проектов, но это не очень удобно. Я посмотрел на размещение переменной LIBS в файле app1.pro, но я не уверен, относится ли это только к статически связанным библиотекам - я пробовал это с различным синтаксисом, и, похоже, это не работает с общими библиотеками. .


person Jake Petroules    schedule 20.05.2010    source источник


Ответы (2)


Вы можете организовать свой проект следующим образом:

  • Project1
    • bin
    • библиотека
    • app1
      • app2.pro
    • app2
      • app2.pro
    • sharedlib
      • sharedlib.pro

в sharedlib.pro можно добавить что-то вроде этого:

TEMPLATE = lib
TARGET = sharedlibr
QT + = core \
      gui
DESTDIR = .. / lib

DESTDIR: гарантирует, что результат компиляции будет скопирован в папку "../lib"

что касается приложений app1 и app2:

TEMPLATE = app
TARGET = app1
QT + = core \
      gui
DESTDIR = .. / bin

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

person jordenysp    schedule 20.05.2010
comment
Это решение отлично работает, спасибо. Хотя на самом деле я просто положил все в мусорное ведро. Извините за задержку с принятием вашего ответа. - person Jake Petroules; 22.05.2010

Чтобы добавить к этому (немного поздно!), можно использовать QMAKE_POST_LINK для копирования файлов после завершения сборки. Пример:

defineReplace(formatpath) {
    path = $$1

    win32 {
        return(\"$$replace(path, "/", "\\")\")
    } else:unix {
        return($$replace(path, " ", "\\ "))
    } else {
        error("Unknown platform in formatpath!")
    }
}

win32:COPY_CMD = copy
unix:COPY_CMD = cp -P
macx:COPY_CMD = cp -R

win32:CMD_SEP = $$escape_expand(\n\t)
unix:CMD_SEP = ";"

win32:LIB_EXT = dll
unix:LIB_EXT = so*
macx:LIB_EXT = dylib

# Put here the directory of your library's build dir, relative to the current directory
# A path is given for example...
MYLIB_BUILD_DIR = $$_PRO_FILE_PWD_/../lib/bin

QMAKE_POST_LINK += $$COPY_CMD $$formatpath($$MYLIB_BUILD_DIR/*.$$LIB_EXT) $$formatpath($$OUT_PWD/$$DESTDIR) $$CMD_SEP
person Jake Petroules    schedule 12.08.2010