C++ 在Windows Qt项目上存储外部库的最佳实践

C++ 在Windows Qt项目上存储外部库的最佳实践,c++,windows,qt,qmake,C++,Windows,Qt,Qmake,我正在Qt中的一个项目中工作,该项目使用了许多外部库,我想知道是否有一种通用的方法可以使源代码在不同的机器之间具有一定的可移植性 目前,我通过Qt Creator(addlibrary…)将各种库添加到项目中,Qt Creator使用.pro文件中的相对路径。显然,这不仅在我移动项目时停止工作,而且如果库路径发生任何更改,也不会在其他机器上工作。使用绝对路径只能解决部分问题,因为我仍然需要确保每台机器上的每个库都完全位于同一路径下 举个例子,这里有一个混乱的部分,我的.pro文件现在是: LIB

我正在Qt中的一个项目中工作,该项目使用了许多外部库,我想知道是否有一种通用的方法可以使源代码在不同的机器之间具有一定的可移植性

目前,我通过Qt Creator(addlibrary…)将各种库添加到项目中,Qt Creator使用.pro文件中的相对路径。显然,这不仅在我移动项目时停止工作,而且如果库路径发生任何更改,也不会在其他机器上工作。使用绝对路径只能解决部分问题,因为我仍然需要确保每台机器上的每个库都完全位于同一路径下

举个例子,这里有一个混乱的部分,我的.pro文件现在是:

LIBS += -L"c:/Program Files/Microsoft SDKs/Kinect/v1.7/lib/x86/" -lKinect10

win32 {
INCLUDEPATH += "c:/Program Files/Microsoft SDKs/Kinect/v1.7/inc"
DEPENDPATH += "c:/Program Files/Microsoft SDKs/Kinect/v1.7/inc"
}

LIBS += -ladvapi32 \
-lgdi32

INCLUDEPATH += "$$PWD/../../../../../Libraries/PCL 1.6.0/include/pcl-1.6"
DEPENDPATH += "$$PWD/../../../../../Libraries/PCL 1.6.0/include/pcl-1.6"

INCLUDEPATH += "C:/Libraries/PCL 1.6.0/3rdParty/Boost/include"
DEPENDPATH += "C:/Libraries/PCL 1.6.0/3rdParty/Boost/include"

LIBS += -L"$$PWD/../../../../../Libraries/PCL 1.6.0/3rdParty/Boost/lib/" -llibboost_date_time-vc100-mt-gd-1_49

LIBS += -L"$$PWD/../../../../../Libraries/PCL 1.6.0/lib/" -lpcl_visualization_debug

LIBS += -L"$$PWD/../../../../../Libraries/opencv/build/x86/vc10/lib/" -lopencv_core245

INCLUDEPATH += "$$PWD/../../../../../Libraries/opencv/include"
DEPENDPATH += "$$PWD/../../../../../Libraries/opencv/include"

组织此活动的最佳方式是什么?

我建议在您的项目中像Qt一样设置一个“第三方”文件夹。这样,您可以正确设置每台机器上相同的路径

如果有必要为不同的体系结构等提供二进制文件,那么我建议甚至导入代码。然后,您可以为目标系统动态构建它们。这比使用预先构建的库要花费更多的时间,但这是灵活应用程序的价格

如果您需要让公共库跨多个项目工作,您可以始终为此使用一个专用的存储库,并有一个必须签出的策略

一个你可能正在寻找的“术语”是存在于Svn世界中的“外部”,但是你也可以把它看作是另一个Git储存库中的Git储存库。关键是,您插入了公共“存储库”,以便在依赖它的项目之间共享

您也可以总是有一个设置脚本,只为用户正确设置路径,而没有太多的灵活性。我在大公司的企业环境中经常看到这种情况,他们试图以一致性为目标,以较少的灵活性为代价


这些东西在我在开源领域的经验中是相当常见的,也是专有的。

你不能像在第三方文件夹中一样将它们放在项目中,比如Qt本身存储第三方源代码吗?也许吧,但是如果我有几个项目使用相同的库呢?还有一些库使用安装程序,并且总是以“Program Files/…”结束,我应该将需要的文件移动到我的项目中吗?我只是想知道在这种情况下,假设有人使用多台机器处理一个项目,通常的做法是什么。