让我们用linux来谈谈它。我有一个“.so”文件。我想使可执行文件依赖于它,在同一目录中查找它。你是如何通过qmake做到的?或者这只能通过使用QLibrary来实现吗?
例如,当你有一个“.so”文件并希望在你的项目中使用它时,在qmake中你写道:
LIBS += -L"path to the folder that contains your .so" -lSoName
但正如你所看到的那样,路径是硬编码的,我想知道在那里写什么来使可执行文件在同一目录中查找“.so”。
答案 0 :(得分:2)
您使用RPATH
您可以使用RPATH指令配置二进制文件或库以在当前目录中查找共享库(或dll),该指令在加载程序在运行时遵循的二进制本身中进行了修饰
1-在.pro
文件中添加以下内容
unix {
message("Adding RPATH to the app")
QMAKE_LFLAGS += -Wl,-rpath=\'\$$ORIGIN/\'
QMAKE_RPATH =
}
这会将可执行文件的RPATH设置为当前目录,并且您的可执行文件将首先尝试在当前目录中查找.so
,然后在标准目录中查找(此过程将解释为here)
2-编译并创建正确设置RPATH的二进制VERIFY后
objdump -x <path/to/binary> |grep RPATH
应该说$ORIGIN
编译时间配置:
CXXFLAGS += -L"/path/to/libmarylin.so/file" -lmarylin
答案 1 :(得分:1)
有几种方法可以做到这一点。
如果可执行文件在当前目录中,请执行LIBS += -L$$(PWD) -lSoName
。
如果您将可执行文件放入由某些qmake
变量(如DESTDIR
指定)的其他子目录中,请使用LIBS += -L$$(DESTDIR)
(或任何包含该目录的变量)。
或者,您可以将包含可执行文件的目录添加到可执行文件的运行时路径中,这会为动态链接器提供一个目录列表,以便在运行时搜索任何未解析的库。这可以使用QMAKE_RPATHDIR += -L$$(PWD)
和LIBS += -lSoName
完成,这将告诉链接器在运行qmake
的当前目录中查找未解析的库。
默认情况下,某些操作系统还可能在库的运行时搜索路径中包含当前目录,在这种情况下,仅执行LIBS += -lSoName
就足够了。但这取决于平台,而上述解决方案则不然。