我正在试图弄清楚如何进一步解决这个问题。如果有意义的话,我也想知道如何安装更新版本的ld。所有包裹经理告诉我,我是最新的。
代码在ubuntu 12.04和12.10上编译并链接并运行g ++(4.7.2),但无法在FC17上编译并出现此错误。
ArchiveServiceLib/debug-posix/libArchiveLib.a(NamedIflTiffCache.o):(.rodata._ZTV26UnlockingGenericFileHandle[_ZTV26UnlockingGenericFileHandle]+0x58): undefined reference to `IHawk::EncryptedHandle::OnNewSecretKey(IHawk::IHPGP::SecretKey&)'
ArchiveServiceLib/debug-posix/libArchiveLib.a(NamedIflTiffCache.o):(.rodata._ZTV26UnlockingGenericFileHandle[_ZTV26UnlockingGenericFileHandle]+0x8c): undefined reference to `non-virtual thunk to IHawk::EncryptedHandle::OnNewSecretKey(IHawk::IHPGP::SecretKey&)'
ld:
的版本12.04 only reports 2.22 (no indication other than 2.22)
12.10 reports 2.22.90.20120924
fedora17 reports 2.22.52.0.1-10.fc17 20120131
g ++的版本:
Ubuntu 12.04 (Ubuntu/Linaro 4.6.3-1ubuntu5) 4.6.3
Ubuntu 12.10 (Ubuntu/Linaro 4.7.2-2ubuntu1) 4.7.2
FC 17 (GCC) 4.7.2 20120921 (Red Hat 4.7.2-2)
包含此方法的所有类的声明如下:
../Include/IHawkLib/IHPGP.h: virtual bool OnNewSecretKey( SecretKey &skey ) = 0;
../Include/IHawkLib/PgpPkidParser.h: virtual bool OnNewSecretKey( SecretKey &skey ) {return true;}
../Include/IHawkLib/EncryptedFileHandle.h: virtual bool OnNewSecretKey( SecretKey &skey );
但是就像g ++忘记将虚拟部分传递给ld所以它可以在链接/ ld时解析它。这似乎发生在2002年和2009年,也许还有其他几次,但在这种情况下,后来的版本似乎已经解决了问题。这一次,它似乎是特定于平台的,鉴于它令人不安的代码没有任何意义。
构建错误的来源是:
std::auto_ptr<IHawk::EncryptedFileHandle> apTmgHandle (GetFileHandle(filename, true, false, pKeyServer));
if (apTmgHandle.get()){
类推导看起来像:
class EncryptedFileHandle : public EncryptedHandle {
....
// Does not mention OnNewSecretKey
....
}
class EncryptedHandle : public IHawk::GenericHandle, protected IHawk::IHPGP {
....
virtual bool OnNewSecretKey( SecretKey &skey ); // Has a concrete implementation
....
}
class IHPGP {
....
virtual bool OnNewSecretKey( SecretKey &skey ) = 0;
....
}
class GenericHandle {
....
// Has no clue about OnNewSecretKey
....
}
链接器命令在所有平台上看起来都是这样,我们正在使用scons并且到目前为止已经能够与平台无关....(对不起长线,只是不想冒险搞砸了它打字错误:
g++ -o debug-posix/ArchiveService -g debug-posix/StdAfx.o debug-posix/ArchiveService_PosixMain.o debug-posix/WebCommands.o -L/usr/local/lib -L/usr/lib/mysql -L/home/mjones/C++/ifl/src/IHDB/debug-posix -L/home/mjones/C++/ifl/src/IHDB -L/home/mjones/C++/ifl/src/XMLib/debug-posix -L/home/mjones/C++/ifl/src/XMLib -L/home/mjones/C++/ifl/src/IHawkLib/debug-posix -L/home/mjones/C++/ifl/src/IHawkLib -L/home/mjones/C++/ifl/src/ImageCore/debug-posix -L/home/mjones/C++/ifl/src/ImageCore -L/home/mjones/C++/ifl/libraries/z39.50/ZExtensions/debug-posix -L/home/mjones/C++/ifl/libraries/z39.50/ZExtensions -L/home/mjones/C++/ifl/src/ServerGuts/debug-posix -L/home/mjones/C++/ifl/src/ServerGuts -L/home/mjones/C++/ifl/libraries/CRUSHER/debug-posix -L/home/mjones/C++/ifl/libraries/CRUSHER -L/home/mjones/C++/ifl/libraries/jsoncpp/debug-posix -L/home/mjones/C++/ifl/libraries/jsoncpp ArchiveServiceLib/debug-posix/libArchiveLib.a -lIHDB -lXMLib -lIHawk -lImageCore -lZExtensions -lServerGuts -lCrusher -ljson -lboost_filesystem-mt -lboost_thread-mt -lboost_regex-mt -lz -lMagickWand -lcrypto++ -lcppunit -llog4cplus -lyaz -lpodofo -lmysqlclient -lxerces-c -ljpeg -lpng -ltiff
答案 0 :(得分:4)
解决问题的第一步是找到定义IHawk::EncryptedHandle
的位置。这可以使用nm
对目标文件来完成,例如:
nm -po *.o | c++filt | grep IHawk::EncryptedHandle | grep -v ' U ' | less
如果定义来自库,则可以添加相应的库,或在相应的目录中使用*.a
和*.so
。一旦符号被定位并且在库中(因为未定义的引用来自库,很可能缺少的符号也在库中),您需要确保具有缺失符号的库在之后指定参考它的那个。我看到它发生了一段时间,但如果符号来自同一个库,则可能需要在库上运行ranlib
。