0

私のOSはWindows7Ultimatex64です。私はQt4.8を使用して、id3libを使用するプログラムを作成しています。Windowsバイナリをダウンロードしました。これは、id3libライブラリがどのように使用されるかを示す*.proファイルの一部です。

HEADERS  += MainWindow.h \
    id3lib/id3/sized_types.h \
    id3lib/id3/globals.h \
    id3lib/id3/tag.h \
    id3lib/id3/utils.h \
    id3lib/id3/id3lib_frame.h \
    id3lib/id3/field.h \
    id3lib/id3/id3lib_strings.h \
    id3lib/id3/id3lib_streams.h

win32: LIBS += -L$$PWD/id3lib/ -lid3lib

INCLUDEPATH += $$PWD/id3lib
DEPENDPATH += $$PWD/id3lib

ご想像のとおり、ライブラリファイル(id3lib.dllおよびid3lib.lib)はid3libディレクトリにあり、必要なすべてのヘッダーはid3lib/id3ディレクトリにあります。

globals.hで、次のように定義しました。

#define ID3LIB_LINKOPTION LINKOPTION_CREATE_DYNAMIC

そして、同じファイルの次のセクションを変更しました。

#    if (ID3LIB_LINKOPTION == LINKOPTION_CREATE_DYNAMIC)
       //used for creating a dynamic dll
#      define ID3_C_EXPORT extern _declspec(dllexport)
#      define ID3_CPP_EXPORT __declspec(dllexport)
#      define CCONV __stdcall // Added for VB & Delphi Compatibility - By FrogPrince Advised By Lothar
#    endif

次のように:

#    if (ID3LIB_LINKOPTION == LINKOPTION_CREATE_DYNAMIC)
       //used for creating a dynamic dll
#      define ID3_C_EXPORT Q_DECL_IMPORT
#      define ID3_CPP_EXPORT Q_DECL_IMPORT
#      define CCONV __stdcall // Added for VB & Delphi Compatibility - By FrogPrince Advised By Lothar
#    endif

Qtで動作するように。

次に、id3/tag.h次のコードを含めて記述しました。

ID3_Tag tag("test.wma");
qDebug() << tag.size();

コンパイル後、次のエラーが発生しました。

undefined reference to `_imp___ZN7ID3_TagC1EPKc'
undefined reference to `_imp___ZNK7ID3_Tag4SizeEv'
undefined reference to `_imp___ZN7ID3_TagD1Ev'
undefined reference to `_imp___ZN7ID3_TagD1Ev'
(several few, same format: `_imp___xxxxx_Tagxxxx')

未定義の参照の原因はわかっていますが、私の場合、リンカーが実装を見つけられなかったのはなぜですか?id3lib.dllにありますか?回避策があるかどうか誰かが知っていますか?

4

2 に答える 2

1

プロジェクトを適切なDLLにリンクするために.libファイルをサポートするVisualStudioを使用していないため、id3lib.a(または同様のもの)が必要です。GNUツールチェーンはMSツールチェーンとは異なるため、適切な静的リンクファイルが必要です。私のアドバイスは、ライブラリをコンパイラで自分でコンパイルすることです。これはオープンソースであるため、実行する価値があります。

于 2012-03-20T12:52:44.620 に答える
1

問題はツールチェーンではなく、ABIにあります。

標準のプレーンCABIが存在するためプレーンCシンボルのみが含まれている場合は、との両方に対してリンクできます。libaMinGw

しかし、それはあなたの場合には当てはまりません(そのような定義がID3_CPP_EXPORT存在するため)。

youserlfでライブラリを作成してみてください。まず、インストールmsysしてmsysシェルを開き、プロジェクトフォルダに移動して試してください

./configure && make
于 2012-03-20T13:08:13.513 に答える