2013-03-21 4 views
3

Используя весь источник LibTomCrypt, я создал файл библиотеки с Visual Studio 2010, который компилируется без проблем. Однако, при создании консольного приложения простой тест, который связывает с библиотекой TomCrypt, я получаю сообщение об ошибке компоновщика для следующего кода:Visual Studio 2010 Ошибка сборки библиотеки LibTomCrypt или библиотеки

Код проверки:

#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; 
} 

Linker Error :

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

Интересно, что debug библиотека отлично работает с тестовым кодом. Это выпуск сборник tomcrypt.lib, который, кажется, пропускает некоторые символы.

Теперь я не новичок в создании и использовании файлов библиотек, но мне интересно, существуют ли какие-то определенные флагов компилятора или меры предосторожности, которые я могу сделать для создания библиотеки в режиме деблокирования и правильной ссылки в моей тестовой программе ? Может ли быть, что статическая структура aes_desc, определенная в коде LibTomCrypt, отсутствует в сборке релиза библиотеки посредством некоторой оптимизации компилятора?

Я надеюсь, что кто-то может предложить некоторое понимание для меня и для всех, кто испытывает эту проблему.

+0

Используете ли вы 'gcc' для создания этого кода со статической библиотекой? Потому что если так, то это не сработает. – Max

ответ

2

Сегодня я столкнулся с проблемой. Конфигурации проекта для визуальной студии включают пользовательские шаги для создания 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> 
+0

Какие шаги вы предприняли для создания надлежащих положений? –

+0

@ by.axiom См. Необходимые изменения в отредактированном ответе. – astraujums