5

これをさらにトラブルシューティングする方法を見つけようとしています。また、それが理にかなっていれば、新しいバージョンの 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 );

しかし、リンク/ld 時に解決できるように、g++ が仮想部分を 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
4

1 に答える 1

6

IHawk::EncryptedHandle問題をトラブルシューティングするための最初のステップは、が定義されている場所を見つけることです。これはnm、オブジェクト ファイルを使用して実行できます。たとえば、次のようになります。

nm -po *.o | c++filt | grep IHawk::EncryptedHandle | grep -v ' U ' | less

定義がライブラリからのものである場合は、対応するライブラリを追加するか、適切なディレクトリで*.aandを使用できます。*.soシンボルが特定されてライブラリに配置されたら (未定義の参照はライブラリからのものであるため、欠落しているシンボルもライブラリにある可能性が高い)、欠落しているシンボルを含むライブラリが後で指定されていることを確認する必要があります。それを参照するもの。それが起こるのを見てからしばらく経ちましたが、シンボルが同じライブラリからのものである場合、ranlibライブラリで実行する必要があるかもしれません。

于 2013-01-03T22:52:50.833 に答える