Qt 能否在qmake中指定exe的路径?

Qt 能否在qmake中指定exe的路径?,qt,qmake,Qt,Qmake,让我们用linux术语来讨论它。我有一个“.so”文件。我想让可执行文件依赖于它,在同一个目录中查找它。你是如何通过qmake做到这一点的?或者,这只能通过使用QLibrary来实现吗 例如,当您有一个“.so”文件并希望在项目中使用它时,请在qmake中编写: LIBS += -L"path to the folder that contains your .so" -lSoName 但是,正如您所看到的,路径是硬编码的,我想知道如何在那里编写代码,使可执行文件在同一目录中查找“.so”。有

让我们用linux术语来讨论它。我有一个“.so”文件。我想让可执行文件依赖于它,在同一个目录中查找它。你是如何通过qmake做到这一点的?或者,这只能通过使用QLibrary来实现吗

例如,当您有一个“.so”文件并希望在项目中使用它时,请在qmake中编写:

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

但是,正如您所看到的,路径是硬编码的,我想知道如何在那里编写代码,使可执行文件在同一目录中查找“.so”。

有几种方法

如果可执行文件在当前目录中,只需执行
LIBS+=-L$$(PWD)-lSoName

如果要将可执行文件放入另一个子目录,该子目录由
qmake
变量(如
DESTDIR
)指定,请使用
LIBS+=-L$$(DESTDIR)
(或保存该目录的任何变量)

或者,您可以将包含可执行文件的目录添加到可执行文件的运行时路径,这将为动态链接器提供一个目录列表,以便在运行时搜索任何未解析的库。这可以通过
QMAKE\u RPATHDIR+=-L$$(PWD)
LIBS+=-lSoName
完成,这将告诉链接器在运行
QMAKE
的当前目录中查找未解析的库


默认情况下,某些操作系统还可能在库的运行时搜索路径中包含当前目录,在这种情况下,仅执行
LIBS+=-lSoName
就足够了。不过,这取决于平台,而上述解决方案并非如此。

有几种方法可以做到这一点

如果可执行文件在当前目录中,只需执行
LIBS+=-L$$(PWD)-lSoName

如果要将可执行文件放入另一个子目录,该子目录由
qmake
变量(如
DESTDIR
)指定,请使用
LIBS+=-L$$(DESTDIR)
(或保存该目录的任何变量)

或者,您可以将包含可执行文件的目录添加到可执行文件的运行时路径,这将为动态链接器提供一个目录列表,以便在运行时搜索任何未解析的库。这可以通过
QMAKE\u RPATHDIR+=-L$$(PWD)
LIBS+=-lSoName
完成,这将告诉链接器在运行
QMAKE
的当前目录中查找未解析的库

默认情况下,某些操作系统还可能在库的运行时搜索路径中包含当前目录,在这种情况下,仅执行
LIBS+=-lSoName
就足够了。不过,这取决于平台,而上述解决方案则不是

您可以配置二进制文件或库,以便使用RPATH指令在当前目录中查找共享库(或dll),RPATH指令添加在二进制文件本身中,加载程序在运行时会遵守该指令

1-在
.pro
文件中添加以下内容

unix {
        message("Adding RPATH to the app")
        QMAKE_LFLAGS    +=  -Wl,-rpath=\'\$$ORIGIN/\'
        QMAKE_RPATH     =
}
这将把可执行文件的RPATH设置为当前目录,可执行文件将首先尝试在当前目录中,然后在标准目录中查找该

2-编译和创建二进制文件后,请验证RPATH设置是否正确

objdump -x <path/to/binary> |grep RPATH
您使用的是

您可以配置二进制文件或库,以便使用RPATH指令在当前目录中查找共享库(或dll),RPATH指令添加在二进制文件本身中,加载程序在运行时会遵守该指令

1-在
.pro
文件中添加以下内容

unix {
        message("Adding RPATH to the app")
        QMAKE_LFLAGS    +=  -Wl,-rpath=\'\$$ORIGIN/\'
        QMAKE_RPATH     =
}
这将把可执行文件的RPATH设置为当前目录,可执行文件将首先尝试在当前目录中,然后在标准目录中查找该

2-编译和创建二进制文件后,请验证RPATH设置是否正确

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

您希望在运行时或编译时在同一目录中找到您的.so?@null指针运行时。是否希望在运行时或编译时在同一目录中找到您的。所以?@null指针运行时。我刚才说的是可执行文件的目录,而不是qmake的目录。在运行时使用QLibrary,我可以获得可执行文件的路径并加载。因此,从同一个目录,但我想知道是否可以通过qmake完成。@Pavel链接的共享库必须始终位于可执行文件旁边或全局路径中。给qmake的路径只是用于链接,而不是用于执行。共享库将始终在同一目录中查找,并且在执行过程中全局路径(win)或全局库路径(lin)(默认行为)@SebastianLange非常感谢!我只是从qt的角度学习了这些东西,但不是从g++的角度,所以我还不知道幕后到底发生了什么。现在你解释了。我说的是可执行文件的目录,而不是qmake的目录。在运行时使用QLibrary,我可以获得可执行文件的路径并加载。因此,从同一个目录,但我想知道是否可以通过qmake完成。@Pavel链接的共享库必须始终位于可执行文件旁边或全局路径中。给qmake的路径只是用于链接,而不是用于执行。共享库将始终在同一目录中查找,并且在执行过程中全局路径(win)或全局库路径(lin)(默认行为)@SebastianLange非常感谢!我只是从qt的角度学习了这些东西,但不是从g++的角度,所以我还不知道幕后到底发生了什么。现在你解释了,“LIBS+=”呢?那句话是怎么说的?我刚写了“-lSoName”,但它不起作用。请按照您指定的方式留下这行,然后尝试我的建议。顺便说一句,如果你的库通常被命名为“libmarylin.so”,那么你应该说“-lmarylin”(去掉“lib”部分),我刚刚做了,但它不起作用。找不到“.so”。这对您有用吗?请尝试使用CXXFLAGS更改lib。顺便说一下,我知道“lib”部分。你上次的消息是什么意思?关于“LIBS+=”呢?怎么了