3

LibTomCrypt ソース全体を使用して、問題なくコンパイルされる Visual Studio 2010 でライブラリ ファイルを作成しました。ただし、TomCrypt ライブラリとリンクする単純なテスト コンソール アプリケーションを作成すると、次のコードのリンカ エラーが発生します。

テストコード:

#include <stdio.h>
#include <tomcrypt.h>

int main()
{
    int Cipher;

    register_cipher( &aes_desc );
    Cipher = find_cipher( "aes" );
    if( Cipher != CRYPT_OK )
        return 0;

    printf( "Cipher name: %s\n", cipher_descriptor[ Cipher ].name );
    unregister_cipher( &aes_desc );

    return 0;
}

リンカ エラー:

error LNK1120: 1 unresolved externals
error LNK2001: unresolved external symbol _aes_desc

興味深いことに、デバッグライブラリのビルドはテスト コードと完全に連携します。一部のシンボルが欠落しているように見えるのは、 tomcrypt.libリリースビルドです。

今、私はライブラリファイルを構築して使用するのは初めてではありませんが、ライブラリをリリースモードで構築し、テストプログラムで正しくリンクさせるためにできる特定のコンパイラフラグまたは予防措置はあるのでしょうか? LibTomCrypt コードで定義されている静的な aes_desc 構造体が、コンパイラの最適化によってライブラリのリリース ビルドから欠落している可能性はありますか?

誰かが私自身とこの問題を経験している他の誰かに洞察を提供できることを願っています.

4

1 に答える 1

2

今日、関連する問題に遭遇しました。Visual Studio のプロジェクト構成には、aes.c をビルドするためのカスタム手順が含まれていますが、デバッグ ビルドのみを対象としています。リリース ビルド用に同等の準備をした後は、すべて問題ありませんでした。

Visual Studio 2010 プロジェクトをテキスト エディターで開き、カスタム ビルド手順を以下のものに置き換えます。これにより、Debug ビルドのいくつかの警告も修正されます。

    <CustomBuild Include="src\ciphers\aes\aes.c">
      <Command Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">cl /nologo /MTd /W3 /Gm /EHsc /ZI /Od /I "src\headers" /I "..\libtommath" /D "_DEBUG" /D "LTM_DESC" /D "WIN32" /D "_MBCS" /D "_LIB" /D "LTC_SOURCE" /D "USE_LTM" /Fp"Debug/libtomcrypt.pch" /Fo"Debug/" /Fd"Debug/" /FD /RTC1 /c %(FullPath)  
cl /nologo /DENCRYPT_ONLY /MTd /W3 /Gm /EHsc /ZI /Od /I "src\headers" /I "..\libtommath" /D "_DEBUG" /D "LTM_DESC" /D "WIN32" /D "_MBCS" /D "_LIB" /D "LTC_SOURCE" /D "USE_LTM" /Fp"Debug/libtomcrypt.pch" /Fo"Debug/aes_enc.obj" /Fd"Debug/" /FD /RTC1 /c %(FullPath)</Command>
      <Outputs Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">Debug/aes.obj;Debug/aes_enc.obj;%(Outputs)</Outputs>
    </CustomBuild>
    <CustomBuild Include="src\ciphers\aes\aes.c">
      <Command Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">cl /nologo /MT /W3 /O2 /I "src\headers" /I "..\libtommath" /D "NDEBUG" /D "LTM_DESC" /D "WIN32" /D "_MBCS" /D "_LIB" /D "LTC_SOURCE" /D "USE_LTM" /Fp"Release/libtomcrypt.pch" /Fo"Release/" /Fd"Release/" /FD /c %(FullPath)  
cl /nologo /DENCRYPT_ONLY /MT /W3 /O2 /I "src\headers" /I "..\libtommath" /D "NDEBUG" /D "LTM_DESC" /D "WIN32" /D "_MBCS" /D "_LIB" /D "LTC_SOURCE" /D "USE_LTM" /Fp"Release/libtomcrypt.pch" /Fo"Release/aes_enc.obj" /Fd"Release/" /FD /c %(FullPath)</Command>
      <Outputs Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">Release/aes.obj;Release/aes_enc.obj;%(Outputs)</Outputs>
    </CustomBuild>
于 2013-08-08T22:34:12.427 に答える