我想使用一个利用QT级QVector2D的库来计算B样条(库:https://github.com/ejmahler/SplineLibrary)。但我无法弄清楚如何使用简单的.cpp文件和使用g ++进行编译来获得包含/链接权。
这是我的尝试
// test.cpp
// My attempt at including the QVector2D class
#include </home/user/Qt/5.8/gcc_64/include/QtCore/qconfig.h>
#include </home/user/Qt/5.8/gcc_64/include/QtCore/qglobal.h>
#include </home/user/Qt/5.8/gcc_64/include/QtGui/qtguiglobal.h>
#include </home/user/Qt/5.8/gcc_64/include/QtGui/qvector2d.h>
// For spline library
#include <SplineLibrary/spline_library/spline.h>
#include <SplineLibrary/spline_library/vector.h>
#include <SplineLibrary/spline_library/splines/uniform_cr_spline.h>
int main()
{
std::vector<QVector2D> splinePoints{
QVector2D( 0, 1),
...
};
UniformCRSpline<QVector2D> mySpline(splinePoints);
QVector2D interpolatedPosition = mySpline.getPosition(0.5f);
}
使用g ++ 5进行编译
$ g++ -std=c++17 test.cpp -o test
给出
/home/user/Qt/5.8/gcc_64/include/QtCore/qglobal.h:63:28: fatal error:
QtCore/qconfig.h: No such file or directory compilation terminated.
我已经验证文件qconfig.h存在,并且它在包含的路径中。
我猜测我的错误是我尝试包含QT标头的方式,我需要以某种方式链接它。
如何正确包含单个Qt组件(在本例中为QVector2D)并使用g ++编译项目?
答案 0 :(得分:0)
首先,你永远不应该指定你所包含的绝对路径。如果其他人想要使用您的代码,他们需要修改所有文件以指向其系统上的正确标头。除此之外,您使用的是内部标题,而您不应该包括自己。在Qt documentation for QVector2D
的最顶部,您可以找到您应该包含的标题,以便使用QVector2D
类。
所以test.cpp应该是这样的:
#include <QVector2D>
// For spline library
#include <SplineLibrary/spline_library/spline.h>
#include <SplineLibrary/spline_library/vector.h>
#include <SplineLibrary/spline_library/splines/uniform_cr_spline.h>
int main()
{
std::vector<QVector2D> splinePoints{
QVector2D( 0, 1),
...
};
UniformCRSpline<QVector2D> mySpline(splinePoints);
QVector2D interpolatedPosition = mySpline.getPosition(0.5f);
}
现在,由于您有Qt5.8的自定义安装路径,编译器无法在默认搜索路径中找到标头,因此在编译此文件时,您需要告诉编译器在哪里搜索Qt头。如上面链接的文档中的QT += Gui
行所示,QVector2D
是QtGui子库的一部分,因此您需要在目录/home/user/Qt/5.8/gcc_64/include/QtGui/
中包含标题。执行此操作的编译器标志为-isystem /home/user/Qt/5.8/gcc_64/include/QtGui
。
但是,QtGui标头本身依赖于QtCore标头,但它们的路径是相对于/home/user/Qt5.8/gcc_64/include
目录给出的,所以为了让编译器找到QtGui标头所依赖的头文件,你还需要添加编译器标志-isystem /home/user/Qt/5.8/gcc_64/include
。顺便说一下,这也是你得到错误QtCore/qconfig.h: No such file or directory compilation terminated.
的原因,QtCore/qconfig.h
所在的目录中没有这样的文件test.cpp
,系统包含路径中也没有,{你没有为编译器提供寻找它的额外路径。
因此,在执行g++ -std=c++14 -isystem /home/user/Qt/5.8/gcc_64/include -isystem /home/user/Qt/5.8/gcc_64/include/QtGui -fPIC -c test.cpp
时,编译应该会成功(假设编译器之前没有找到SplineLibrary
包含的任何问题)。
上一个命令只编译test.cpp
(注意-c
标志),但不会产生可以运行的二进制文件。链接器具有与编译器相同的问题 - 它不知道在哪里可以找到要链接的预编译Qt库,除非您告诉它在哪里查找它们。这样做的标志是-L/home/user/Qt/5.8/gcc_64/lib
。
除了告诉链接器在哪里查找预编译库之外,还需要告诉它您正在使用哪些库。正如我之前提到的,QVector2D
是QtGui子库的一部分,因此您需要添加-lQt5Gui
。由于QtGui依赖于QtCore,因此还需要添加-lQt5Core
。
假设您使用了默认安装程序,Qt的安装仅包含动态库,因此您还需要告知链接器将信息存储在创建的二进制文件中查找库文件的位置。您需要为此添加的标记是-Wl,-rpath=/home/user/Qt/5.8/gcc_64/lib
。
所以把所有东西放在一起,你需要运行的最后一个命令是g++ -std=c++14 -fPIC -isystem /home/user/Qt/5.8/gcc_64/include -isystem /home/user/Qt/5.8/gcc_64/include/QtGui -L /home/user/Qt/5.8/gcc_64/lib -Wl,-rpath=/home/user/Qt/5.8/gcc_64/lib test.cpp -lQt5Core -lQt5Gui
。
如果您使用clang而不是gcc,如果您将g++
替换为clang++
,则相同的命令运行正常。