2016-10-10 6 views
0

Давайте поговорим об этом в терминах linux. У меня есть файл .so. Я хочу, чтобы исполняемый файл зависел от него, ищите его в том же каталоге. Как вы это делаете с помощью qmake? Или это может быть достигнуто только с помощью QLibrary?Можете ли вы указать путь к exe в qmake?

Например, если у вас есть файл «.so» и хотите использовать его в проекте, в QMAKE Вы пишете:

LIBS += -L"path to the folder that contains your .so" -lSoName 

Но путь жёстко, как вы можете видеть, и я «Интересно, что писать там, чтобы сделать исполняемый файл« .so »в том же каталоге.

+0

вы хотите, чтобы ваш .so можно найти в той же директории ectory во время выполнения или времени компиляции? – PnotNP

+0

@NulledPointer runtime. – Pavel

ответ

1

Существует несколько способов сделать это.

Если исполняемый файл выполняется в текущем каталоге, просто выполните LIBS += -L$$(PWD) -lSoName.

Если вы помещаете исполняемый файл в какой-либо другой подкаталог, указанный некоторой переменной qmake, например DESTDIR, используйте LIBS += -L$$(DESTDIR) (или любую другую переменную содержит эту директорию).

В качестве альтернативы вы можете добавить каталог с исполняемым файлом к ​​пути выполнения исполняемого файла, что дает динамическому компоновщику список каталогов для поиска любых неразрешенных библиотек во время выполнения. Это можно сделать с помощью QMAKE_RPATHDIR += -L$$(PWD) и LIBS += -lSoName, которые расскажут компоновщику о поиске неразрешенных библиотек в текущем каталоге, где запущен qmake.

Некоторые операционные системы могут также включать текущий каталог в путь поиска во время выполнения для библиотек по умолчанию, и в этом случае достаточно сделать LIBS += -lSoName. Это зависит от платформы, хотя в то время как вышеупомянутые решения не являются.

+0

Я говорил о директории исполняемого файла, а не о директории qmake. С QLibrary во время выполнения я могу получить путь к исполняемому файлу и загрузить .so из того же каталога, но мне было интересно, можно ли это сделать через qmake. – Pavel

+1

@Pavel связанные общие библиотеки всегда должны быть рядом с исполняемым файлом или глобальным путем. Путь, заданный qmake, предназначен только для связи, а не для выполнения. Общая библиотека всегда будет искать в пределах одного и того же каталога и глобального пути (win) или глобального lib-пути (lin) во время выполнения (поведение по умолчанию) –

+0

@SebastianLange благодарит! Я только что изучил этот материал с точки зрения qt, но не с точки зрения g ++, поэтому я не знаю, что именно происходит за кулисами. Теперь вы объяснили. – Pavel

2

используется RPATH

Вы можете настроить ваш бинарный файл или библиотеку, чтобы найти общую библиотеку (или DLL) в текущем каталоге, используя RPATH директиву, которая emedded в самом двоичном, который загрузчик уважающего во время выполнения

1- Добавьте в ваш файл .pro

unix { 
     message("Adding RPATH to the app") 
     QMAKE_LFLAGS += -Wl,-rpath=\'\$$ORIGIN/\' 
     QMAKE_RPATH  = 
} 

Это установит RPATH в исполняемый файл для текущего каталога и ваш исполняемый файл будет первые пытаются искать этот .so в текущем каталоге, а затем в стандартном каталоге (этот процесс объясняется here)

2- После компиляции и создания двоичного VERIFY, что RPATH установлен правильно

objdump -x <path/to/binary> |grep RPATH 

он должен говорят, конфигурация времени $ORIGIN

Compile:

CXXFLAGS += -L"/path/to/libmarylin.so/file" -lmarylin 
+0

Как насчет "LIBS + ="? Что происходит на этой линии? Я просто написал «-lSoName», и он не работает. – Pavel

+0

Оставьте эту строку, как вы указали, и попробуйте мое предложение. BTW, если ваша библиотека обычно называется «libmarylin.so», тогда вы должны сказать «-lmarylin» (отбрасывая часть «lib») – PnotNP

+0

Я просто сделал, и это не сработает. Не удается найти «.so». Это работает для вас? – Pavel