【发布时间】:2015-05-23 07:25:37
【问题描述】:
我正在尝试在 Debian 中编译以下简短的 C++ 程序(不是我编写的):
$ cat checksig.cpp
#include <QByteArray>
#include <QDebug>
#include <openssl/ec.h>
#include <openssl/evp.h>
#include <openssl/ecdsa.h>
#include <openssl/sha.h>
static EC_KEY* EC_KEY_pub_key ( const QByteArray& pub )
{
static EC_KEY* eckey = EC_KEY_new_by_curve_name ( NID_secp256k1 );
const quint8* ppub = (const quint8*)pub.constData ( );
o2i_ECPublicKey ( &eckey, &ppub, pub.size ( ) );
return eckey;
}
//--------------------------------------------------------------
int main(int argc, char *argv[])
{
const QByteArray data ( QByteArray::fromHex ( argv [1] ) );
const QByteArray sign ( QByteArray::fromHex ( argv [2] ) );
const QByteArray pubk ( QByteArray::fromHex ( argv [3] ) );
quint8 tmp [32];
::SHA256 ( (const quint8*)data.constData ( ), data.size ( ), tmp );
quint8 digest [32];
::SHA256 ( tmp, 32, digest );
qDebug ( ) << "data=" << QString ( data.toHex ( ) );
qDebug ( ) << "sign=" << QString ( sign.toHex ( ) );
qDebug ( ) << "pubk=" << QString ( pubk.toHex ( ) );
qDebug ( ) << "digest=" << QString ( QByteArray ( (const char*)digest, 32 ).toHex ( ) );
const bool v ( ::ECDSA_verify ( 0, digest, 32, (const quint8*)sign.constData ( ), sign.size ( ), EC_KEY_pub_key ( pubk ) ) );
qDebug ( ) << "result=" << v;
return 0;
}
但我认为我没有使用正确的包含,或者我可能需要安装更多 Qt 库?
$ g++ -Wall checksig.cpp -o checksig -L /usr/include/i386-linux-gnu/qt5/QtCore/ -lQtCore -I /usr/include/i386-linux-gnu/qt5/QtCore/
In file included from /usr/include/i386-linux-gnu/qt5/QtCore/QByteArray:1:0,
from checksig.cpp:4:/usr/include/i386-linux-gnu/qt5/QtCore/qbytearray.h:45:30: fatal error: QtCore/qrefcount.h: No such file or directory
#include <QtCore/qrefcount.h>
^
或者,使用一个目录中的包含和库:
g++ -Wall checksig.cpp -o checksig -L /usr/include/i386-linux-gnu/qt5/ -lQtCore -I /usr/include/i386-linux-gnu/qt5/
checksig.cpp:4:22: fatal error: QByteArray: No such file or directory
#include <QByteArray>
^
compilation terminated.
我是 C++ 新手。如何在 1-liner 中编译这个小程序?
根据 cmets 的要求:
$ sudo apt-file search "QtCore/qrefcount.h"
qtbase5-dev: /usr/include/i386-linux-gnu/qt5/QtCore/qrefcount.h
感谢Michael Popovich 的回答,我尝试了以下方法并走得更远。但现在我有新的错误:
$ g++ -Wall checksig.cpp -o checksig -L /usr/include/i386-linux-gnu/qt5/QtCore/ -lQtCore -I /usr/include/i386-linux-gnu/qt5/ -I /usr/include/i386-linux-gnu/qt5/QtCore/
In file included from /usr/include/i386-linux-gnu/qt5/QtCore/qatomic.h:42:0,
from /usr/include/i386-linux-gnu/qt5/QtCore/qrefcount.h:45,
from /usr/include/i386-linux-gnu/qt5/QtCore/qbytearray.h:45,
from /usr/include/i386-linux-gnu/qt5/QtCore/QByteArray:1,
from checksig.cpp:4:
/usr/include/i386-linux-gnu/qt5/QtCore/qglobal.h:1034:4: error: #error "You must build your code with position independent code if Qt was built with -reduce-relocations. " "Compile your code with -fPIC or -fPIE."
# error "You must build your code with position independent code if Qt was built with -reduce-relocations. "\
^
我不知道 qt 是否是使用 -reduce-relocations 构建的
无论如何,尝试使用-fPIC 和-fPIE:
$ g++ -Wall checksig.cpp -o checksig -L /usr/include/i386-linux-gnu/qt5/QtCore/ -lQtCore -I /usr/include/i386-linux-gnu/qt5/ -I /usr/include/i386-linux-gnu/qt5/QtCore/ -fPIC
/usr/bin/ld: cannot find -lQtCore
collect2: error: ld returned 1 exit status
$ g++ -Wall checksig.cpp -o checksig -L /usr/include/i386-linux-gnu/qt5/QtCore/ -lQtCore -I /usr/include/i386-linux-gnu/qt5/ -I /usr/include/i386-linux-gnu/qt5/QtCore/ -fPIE
/usr/bin/ld: cannot find -lQtCore
collect2: error: ld returned 1 exit status
【问题讨论】:
-
安装“apt-file”,然后使用它来定位包含“QtCore/qrefcount.h”的包。此外,请确保您了解在线上数百个带有类似错误消息的其他问题中的问题所在。进行网络搜索以找到这些。
-
-I /usr/include/i386-linux-gnu/qt5/QtCore/可能进入一个目录太远了。在我看来编译器正在寻找/usr/include/i386-linux-gnu/qt5/QtCore/QtCore/qrefcount.h -
我也这么认为,但没有运气。我会将这种替代尝试添加到操作中
-
如果同时指定有和没有 QtCore 会发生什么? qrefcount.h 相对于 qbytearray.h 在哪里?打赌它们在同一个文件夹中。
-
@user4581301 如果我删除
-lQtCore,结果实际上是相同的。你是这个意思吗?
标签: c++ qt compiler-errors