none
Ошибка 2019 - ссылка на неразрешенный внешний символ RRS feed

  • Вопрос

  • Как решить проблему?
    1>fff.obj : error LNK2019: ссылка на неразрешенный внешний символ "int __stdcall sol_DeleteGrammarEngine(void *)" (?sol_DeleteGrammarEngine@@YGHPAX@Z) в функции _main
    1>fff.obj : error LNK2019: ссылка на неразрешенный внешний символ "int __stdcall sol_CountEntries(void *)" (?sol_CountEntries@@YGHPAX@Z) в функции _main
    1>fff.obj : error LNK2019: ссылка на неразрешенный внешний символ "void * __stdcall sol_CreateGrammarEngineW(wchar_t const *)" (?sol_CreateGrammarEngineW@@YGPAXPB_W@Z) в функции _main
    1>fff.obj : error LNK2019: ссылка на неразрешенный внешний символ "int __stdcall sol_FindEntry(void *,wchar_t const *,int,int)" (?sol_FindEntry@@YGHPAXPB_WHH@Z) в функции "void __cdecl TestRussian(void *)" (?TestRussian@@YAXPAX@Z)
    1>fff.obj : error LNK2019: ссылка на неразрешенный внешний символ "int __stdcall sol_DeletePhraseGenerator(void *)" (?sol_DeletePhraseGenerator@@YGHPAX@Z) в функции "void __cdecl TestEnglish(void *)" (?TestEnglish@@YAXPAX@Z)
    1>fff.obj : error LNK2019: ссылка на неразрешенный внешний символ "int __stdcall sol_DeleteGeneratedPhrase(wchar_t *)" (?sol_DeleteGeneratedPhrase@@YGHPA_W@Z) в функции "void __cdecl TestEnglish(void *)" (?TestEnglish@@YAXPAX@Z)
    1>fff.obj : error LNK2019: ссылка на неразрешенный внешний символ "wchar_t * __stdcall sol_GeneratePhrase(void *,int,int)" (?sol_GeneratePhrase@@YGPA_WPAXHH@Z) в функции "void __cdecl TestEnglish(void *)" (?TestEnglish@@YAXPAX@Z)
    1>fff.obj : error LNK2019: ссылка на неразрешенный внешний символ "int __stdcall sol_Paraphrase(void *,int,int,int,int,int,int,int,wchar_t const *,wchar_t *,int,int)" (?sol_Paraphrase@@YGHPAXHHHHHHHPB_WPA_WHH@Z) в функции "void __cdecl TestEnglish(void *)" (?TestEnglish@@YAXPAX@Z)
    1>fff.obj : error LNK2019: ссылка на неразрешенный внешний символ "int __stdcall sol_GetVersion(void *,int *,int *,int *)" (?sol_GetVersion@@YGHPAXPAH11@Z) в функции "void __cdecl TestEnglish(void *)" (?TestEnglish@@YAXPAX@Z)
    1>fff.obj : error LNK2019: ссылка на неразрешенный внешний символ "void * __stdcall sol_CreatePhraseGenerator(void *,int)" (?sol_CreatePhraseGenerator@@YGPAXPAXH@Z) в функции "void __cdecl TestEnglish(void *)" (?TestEnglish@@YAXPAX@Z)
    1>fff.obj : error LNK2019: ссылка на неразрешенный внешний символ "int __stdcall sol_MatchNGrams(void *,wchar_t const *,int *,int *,int *)" (?sol_MatchNGrams@@YGHPAXPB_WPAH22@Z) в функции "void __cdecl Imitate(wchar_t const *,int)" (?Imitate@@YAXPB_WH@Z)
    1>fff.obj : error LNK2019: ссылка на неразрешенный внешний символ "int __stdcall sol_LoadKnowledgeBase(void *,wchar_t const *)" (?sol_LoadKnowledgeBase@@YGHPAXPB_W@Z) в функции "void __cdecl Imitate(wchar_t const *,int)" (?Imitate@@YAXPB_WH@Z)
    1>fff.obj : error LNK2019: ссылка на неразрешенный внешний символ "int __stdcall sol_BuildKnowledgeBase(void *,wchar_t const *,wchar_t const *,int,int)" (?sol_BuildKnowledgeBase@@YGHPAXPB_W1HH@Z) в функции "void __cdecl Imitate(wchar_t const *,int)" (?Imitate@@YAXPB_WH@Z)
    1>fff.obj : error LNK2019: ссылка на неразрешенный внешний символ "int __stdcall sol_BuildKnowledgeBase2(void *,wchar_t const *,int,int)" (?sol_BuildKnowledgeBase2@@YGHPAXPB_WHH@Z) в функции "void __cdecl Imitate(wchar_t const *,int)" (?Imitate@@YAXPB_WH@Z)
    1>fff.obj : error LNK2019: ссылка на неразрешенный внешний символ "int __stdcall sol_Set2GramsForPhrase(void *,int,int const *)" (?sol_Set2GramsForPhrase@@YGHPAXHPBH@Z) в функции "void __cdecl TestGenerator(void)" (?TestGenerator@@YAXXZ)
    1>fff.obj : error LNK2019: ссылка на неразрешенный внешний символ "int __stdcall sol_SetWordsForPhrase(void *,int,int const *,int)" (?sol_SetWordsForPhrase@@YGHPAXHPBHH@Z) в функции "void __cdecl TestGenerator(void)" (?TestGenerator@@YAXXZ)
    1>fff.obj : error LNK2019: ссылка на неразрешенный внешний символ "int __stdcall sol_StopSynonyms(void *,int,int const *,int)" (?sol_StopSynonyms@@YGHPAXHPBHH@Z) в функции "void __cdecl TestSynonymizer(void)" (?TestSynonymizer@@YAXXZ)
    1>fff.obj : error LNK2019: ссылка на неразрешенный внешний символ "void __stdcall sol_DeleteProjections(void *)" (?sol_DeleteProjections@@YGXPAX@Z) в функции "void __cdecl TestSynonymizer(void)" (?TestSynonymizer@@YAXXZ)
    1>fff.obj : error LNK2019: ссылка на неразрешенный внешний символ "int __stdcall sol_GetIEntry(void *,int)" (?sol_GetIEntry@@YGHPAXH@Z) в функции "void __cdecl TestSynonymizer(void)" (?TestSynonymizer@@YAXXZ)
    1>fff.obj : error LNK2019: ссылка на неразрешенный внешний символ "void * __stdcall sol_ProjectWord(void *,wchar_t const *,int)" (?sol_ProjectWord@@YGPAXPAXPB_WH@Z) в функции "void __cdecl TestSynonymizer(void)" (?TestSynonymizer@@YAXXZ)
    1>C:\Users\111\Desktop\fff\Debug\fff.exe : fatal error LNK1120: 20 неразрешенных внешних элементов

    Вот текст программы:

    #include "StdAfx.h"
    #include <iostream>
    #include <vector>
    #include <tchar.h>
    #include <windows.h>
    #include <process.h>
    #include <assert.h>

    // Grammar Engine API
    // API грамматической машины
    #include <D:\Program Files (x86)\SynonymizerSDK\include\lem\solarix\synonymizer_engine.h>
    #include <D:\Program Files (x86)\SynonymizerSDK\include\lem\solarix\_sg_api.h>

    using namespace std;

    void TestRussian( HFAIND hEngine );
    void TestEnglish( HFAIND hEngine );

    const int DEF_TIMEOUT = 1000000; // 1000 секунд

    static bool exists( const TCHAR *path )
    { return GetFileAttributes(path)!=(DWORD)INVALID_FILE_ATTRIBUTES; }

    // **************************************************************
    // Вспомогательная процедура - вывод UNICODE текста на консоль
    // **************************************************************
    static void wide( const wchar_t *ustr )
    {
     if( ustr==NULL || *ustr==0 )
      return;

     const int l = wcslen(ustr);
     char *abuffer = new char[l+1];
     memset( abuffer, 0, l+1 );
     WideCharToMultiByte( CP_OEMCP, 0, ustr, l+1, abuffer, l+1, NULL, NULL );
     printf( "%s", abuffer );
     delete[] abuffer;

     return;
    }


    static HFAIND hEngine = NULL;
    static HGREN_PHRASOMAT hFG = NULL;


    #if defined TEST_THREADS
    unsigned int __stdcall FG_Thread(void*)
    {
     const wchar_t *words[] = {
                               L"ПОЛУНОЧИ",
                               NULL
                              };  

     std::vector<int> ies;
     int j=0;
     while( words[j]!=NULL )
      {
       int ie = sol_FindEntry( hEngine, words[j++], NOUN_ru, -1 );
       if( ie!=-1 )
        ies.push_back(ie);  
      }

     sol_SetWordsForPhrase( hFG, ies.size(), &*ies.begin(), true );

     // Сгенерируем парочку предложений с измененным набором слов
     for( int i=0; i<1000; i++ )
      {
       wchar_t *phrase = sol_GeneratePhrase(hFG,0xffffffff,FG_DEBUG);
       printf( "#%5d-->", i );
       wide(phrase);
       printf( "\n" );
       sol_DeleteGeneratedPhrase(phrase);
      }

     return 0;
    }
    #endif



    static void Imitate( const wchar_t *src_filename, int language )
    {
     if( GetFileAttributesW(src_filename)==(DWORD)-1 )
      {
       return;
      }

     // генерация квазислучайного текста на основе сведений о матрице переходов,
     // создаваемой по исходному тексту.
     // Сначала строим матрицу.
     int rc1 = sol_BuildKnowledgeBase2( hFG, L"e:\\MVoice\\lem\\scripts\\rewriter\\путеводитель.txt", 3, 0 );
     // Теперь генерация текста.
     for( int i=0; i<20; i++ )
      {
       wchar_t *phrase = sol_GeneratePhrase(
                                            hFG,
                                            FG_GENERATOR_USES_CHAINS,
                                            FG_NO_DEBUG
                                           );

       printf( "#%2d ", i );
       wide(phrase);
       printf( "\n" );

       sol_DeleteGeneratedPhrase(phrase);
      }


     // ------------------------------------------------------------------
     // Имитация стиля - строим базу знаний из текста и затем генерируем
     // случайный текст на основе информации.
     // ------------------------------------------------------------------
     wchar_t tmp_db_folder[MAX_PATH];
     swprintf( tmp_db_folder, L"%s\\TestKnowledgeBase", _wgetenv(L"TMP") );
     CreateDirectoryW( tmp_db_folder, NULL );

     // удалим старое содержимое, если оно было.
     wchar_t cmdx[MAX_PATH*2];
     swprintf( cmdx, L"del /q %s\\*.*", tmp_db_folder );
     _wsystem( cmdx );

     int rc = sol_BuildKnowledgeBase( hEngine, src_filename, tmp_db_folder, language, 0 );
     rc = sol_LoadKnowledgeBase( hFG, tmp_db_folder );

     for( int i=0; i<20; i++ )
      {
       wchar_t *phrase = sol_GeneratePhrase(
                                            hFG,
                                            FG_LOGICS | FG_GERUND1 | FG_GERUND2 | FG_COMSENT |
                                            FG_USE_LEX_WHEN_EXHAUSTED |
                                            FG_DONT_REMOVE_USED |
                                            FG_GENERATOR_USES_NGRAMS,
                                            FG_DEBUG
                                           );

       // рассчитываем оценку достоверности фразы по стистическому критерию
       int unmatched_2_ngrams=0, n2=0, n3=0;
       int rc = sol_MatchNGrams( hEngine, phrase, &unmatched_2_ngrams, &n2, &n3 );
       float r=0.0F;
       if( (n2+unmatched_2_ngrams)!=0 )
        r = float(n2+n3)/float(n2+n3+unmatched_2_ngrams);

       printf( "#%2d ", i );
       wide(phrase);
       printf( " [[%g]]\n", r );
       sol_DeleteGeneratedPhrase(phrase);
      }

     return;
    }


    int main(void)
    {
     // Грузим морфологию, синтаксис и другие модули.
     // Словарь должен быть уже подготовлен и находится в текущем каталоге или одном
     // из стандартных для SDK/Integra каталогов. Для подготовки словаря можно запустить
     // один из скриптов в \sdk\scripts\dictionary.
     cout << "Loading grammar engine...\n";

     bool dict_ok=false;

     const TCHAR * paths[] = {
                              _T("..\\..\\..\\..\\..\\..\\bin-windows\\dictionary.xml"),
                              _T("..\\..\\..\\..\\..\\..\\dictionary.xml"),
                              _T("dictionary.xml"),
                              NULL
                             };

     int ipath=0;
     while( paths[ipath]!=NULL && dict_ok==false )
      {
       if( exists(paths[ipath]) )
        {
         hEngine = sol_CreateGrammarEngine(paths[ipath++]);
         if( hEngine!=NULL )
          dict_ok=true;
        }
      }

     if( dict_ok )
      {
       int nentry = sol_CountEntries(hEngine);
       cout << "Engine is loaded OK\n";
      }
     else
      {
       cout << "Error loading dictionary file 'diction.xml\n"
               "You have to download the latest dictionary build\n"
               "from http://sourceforge.net/project/solarix";
       return -1;
      }

     TestRussian(hEngine);
     //TestEnglish(hEngine);

     // Free allocated resources, delete the engine instance.
     sol_DeleteGrammarEngine(hEngine);

     cout << "All done.\n";

     return 0;
    }


    static void TestGenerator(void);
    static void TestSynonymizer(void);
    static void TestParaphraser(void);
    static void TestImitator(void);


    void TestRussian( HFAIND hEngine )
    {
     if( sol_FindEntry( hEngine, L"МАМА", /*Solarix::API::*/NOUN_ru, /*Solarix::API::*/RUSSIAN_LANGUAGE )==-1 )
      {
       cout << "Russian lexicon is missing.\n";
       return;
      }


     TestGenerator();
     TestSynonymizer();
    // TestParaphraser();
     TestImitator();

     return;
    }




    void TestEnglish( HFAIND hEngine )
    {
     // Проверяем наличие английского лексикона.
     if( sol_FindEntry( hEngine, L"MOTHER", /*Solarix::API::*/NOUN_en, /*Solarix::API::*/ENGLISH_LANGUAGE )==-1 )
      {
       cout << "English lexicon is missing.\n";
       return;
      }

     // Создаем генератор предложений для английского языка
     hFG = sol_CreatePhraseGenerator(hEngine,ENGLISH_LANGUAGE);

     wchar_t buffer[10001];
     memset( buffer, 0, sizeof(buffer) );

     bool is_premium = sol_GetVersion( hEngine, NULL, NULL, NULL);

     if( is_premium )
      {
       // Проверяем сложные синонимы (доступно в версии Premium)

       const wchar_t *orgs[] =
       {
        L"I decided to stay",
        L"I've decided to stay",
        L"We decide to stay",
        L"He decides to stay",
        L"I am deciding to stay",
        L"You must decide to stay",
        NULL
       };

       int iorg=0;
       while( orgs[iorg]!=NULL )
        {
         const wchar_t *s = orgs[iorg];

         int rc2 = sol_Paraphrase(
                                  hFG,
                                  FG_SYNONYMIZE | FG_SYNONYMIZER_MULTIWORD,
                                  FG_PEDANTIC_ANALYSIS,   
                                  FG_NO_NGRAMS,
                                  0,
                                  FG_DEBUG,
                                  FG_YIELD_PLAIN_TEXT,
                                  5,
                                  s,
                                  buffer,
                                  10000,
                                  DEF_TIMEOUT
                                 );

         printf( "%s --> ", s );   
         wide(buffer);
         printf( "\n" );
         iorg++;
        }
      }
    // int rc = sol_Paraphrase( hFG, FG_SYNONYMIZE_OTHERS | FG_SYNONYMIZER_USES_NGRAMS | FG_DEBUG, 5, L"The cat catches the mouse.", buffer, 10000 );

     const wchar_t *orgs[] =
     {
      L"I decided to stay",
      L"The mouse will be surrendering",
      L"The mouse is surrendering",
      L"The jolly mouse", // тут ошибка!
      L"The funny mouse",
      L"The mouse surrendered",
      L"is asked",
      L"will be asked",
      L"will be asking",
      L"will be surrendering",
      L"is surrendering",
      L"The mouse surrenders",
      L"The mouse will surrender",
      L"Kitties",
      L"Funny job",
      L"Merry christmas",
      L"Tremendous danger",
      L"Huge disaster",
      L"The mouse gives up.",
      L"The kitty surrendered.",
      L"White cat silently sleeps.",
      L"Black cat catches the moise.",
      NULL
     };

     int iorg=0;
     while( orgs[iorg]!=NULL )
      {
       const wchar_t *s = orgs[iorg];
       int rc = sol_Paraphrase(
                               hFG,
                               FG_SYNONYMIZE | FG_SYNONYMIZER_MULTIWORD,
                               FG_PEDANTIC_ANALYSIS,   
                               FG_NO_NGRAMS,
                               0,
                               FG_DEBUG,
                               FG_YIELD_PLAIN_TEXT,
                               5,
                               s,
                               buffer,
                               10000,
                               DEF_TIMEOUT
                              );

       if( wcscmp( s, buffer )==0 )
        {
         printf( "Error, no synonymization occured for phrase: %s\n", s );
        }
       else
        {
         printf( "#%d ", iorg );
         wide(s);
         printf( " --> " );
         wide(buffer);
         printf( "\n" );
        }

       iorg++;
      }

     // sol_RandomizePhraseGenerator(hFG);

     // Тестируем нефильтрованную по лексике генерацию
     for( int i=0; i<30; i++ )
      {
       wchar_t *phrase = sol_GeneratePhrase(hFG,0,FG_DEBUG);

       if( wcsstr( phrase, L"(--" )!=NULL || wcsstr( phrase, L"???" )!=NULL )
        {
         printf( "Error in phrase generator!\n" );
        }

       printf( "#%2d ", i );
       wide(phrase);
       printf( "\n" );
       sol_DeleteGeneratedPhrase(phrase);
      }

     Imitate( L"..\\..\\..\\..\\..\\..\\scripts\\rewriter\\etalons-en.txt", ENGLISH_LANGUAGE );

     sol_DeletePhraseGenerator(hFG);

    1 июня 2012 г. 19:06

Ответы

  • Здравствуйте.
    Вероятно, Вы пытаетесь использовать функции внешней библиотеки.
    В этом случае в MS C++ можно использовать прагму comment.
    Например:
    #pragma comment(lib,"Comctl32.lib")
    или
    #pragma comment(lib, "..\\..\\Lib\\x86\\mylib.lib")
    В примерах "Comctl32.lib", "..\\..\\Lib\\x86\\mylib.lib" имена подключаемых внешних библиотек.
    • Помечено в качестве ответа nikolas323 3 июня 2012 г. 11:46

Все ответы

  • Здравствуйте.
    Вероятно, Вы пытаетесь использовать функции внешней библиотеки.
    В этом случае в MS C++ можно использовать прагму comment.
    Например:
    #pragma comment(lib,"Comctl32.lib")
    или
    #pragma comment(lib, "..\\..\\Lib\\x86\\mylib.lib")
    В примерах "Comctl32.lib", "..\\..\\Lib\\x86\\mylib.lib" имена подключаемых внешних библиотек.
    • Помечено в качестве ответа nikolas323 3 июня 2012 г. 11:46
  • Либо в свойствах проекта подключить данную библиотеку, в разделе линковщика.


    Для связи [mail]

    4 июня 2012 г. 11:00