Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Системное программирование и WinAPI > Проблемы c dll


Автор: Death_Master 19.6.2008, 09:39
При попытке связать dll и программу лезут ошибки 
Код

1>Linking...
1>GUI1Dlg.obj : error LNK2019: unresolved external symbol "__declspec(dllimport) class ATL::CStringT<wchar_t,class StrTraitMFC_DLL<wchar_t,class ATL::ChTraitsCRT<wchar_t> > > __cdecl sparse(class ATL::CStringT<wchar_t,class StrTraitMFC_DLL<wchar_t,class ATL::ChTraitsCRT<wchar_t> > >)" (__imp_?sparse@@YA?AV?$CStringT@_WV?$StrTraitMFC_DLL@_WV?$ChTraitsCRT@_W@ATL@@@@@ATL@@V12@@Z) referenced in function "public: void __thiscall CGUI1Dlg::OnBnClickedButton1(void)" (?OnBnClickedButton1@CGUI1Dlg@@QAEXXZ)
1>C:\Documents and Settings\Администратор\Мои документы\Visual Studio 2008\Projects\GUI1\Debug\GUI1.exe : fatal error LNK1120: 1 unresolved externals
1>Build log was saved at "file://c:\Documents and Settings\Администратор\Мои документы\Visual Studio 2008\Projects\GUI1\GUI1\Debug\BuildLog.htm"
1>GUI1 - 2 error(s), 0 warning(s)


В dll 
Код

extern "C++" __declspec(dllexport) CString sparse(CString in_sql);

В проге
Код

extern "C++" __declspec(dllimport) CString sparse(CString in_sql);

Чую, грабли где-то рядом... но пока не знаю где ...
P.S. не спал(30 минут в день не считаю сном) около недели...

Автор: Death_Master 19.6.2008, 12:11
Эхх..
Похоже в вечеру не успеть...
Проклясть МелкоСофт чтоли..

Автор: voov 19.6.2008, 12:59
У меня была похожая проблема.
http://forum.vingrad.ru/forum/topic-203281/kw-error-lnk-2019-unresolved-external.html

Автор: EnergoHokum 19.6.2008, 17:25
DLL и программа генерировались одинаковыми компиляторами (вплоть до версии)? При "торчании" наружу сложных типов данных (хотя-бы даже std::string) возможны проблемы, если связываемые ДЛ-ка и программа генерировались различными компиляторами. С stdlib я такие проблемы огребал (прицеплял ДЛ-ку, сгенерированную GCC, MSVS и BBuilder-ом).
Вместо CString отдавай указатель на массив char-ов, а принимающий пусть переводит его в CString самостоятельно.

Автор: Death_Master 19.6.2008, 19:17
Замена на 
Код

extern "C" __declspec(dllimport) wchar_t * sparse(wchar_t* in_sql, int nn);

не помогает...

Автор: Rififi 19.6.2008, 20:14
проверь соответствие опций компиляции, в частности /Zc:wchar_t

Автор: Death_Master 19.6.2008, 20:35
Цитата(Rififi @  19.6.2008,  20:14 Найти цитируемый пост)
/Zc:wchar_t 

проверил...
не помогло..

Автор: EnergoHokum 20.6.2008, 06:46
Так, а если попробовать динамическое связывание? Я обычно только с ним и работаю.

Автор: xvr 20.6.2008, 11:40
Цитата(Death_Master @ 19.6.2008,  09:39)
При попытке связать dll и программу лезут ошибки 
Код

1>Linking...
1>GUI1Dlg.obj : error LNK2019: unresolved external symbol "__declspec(dllimport) class ATL::CStringT<wchar_t,class StrTraitMFC_DLL<wchar_t,class ATL::ChTraitsCRT<wchar_t> > > __cdecl sparse(class ATL::CStringT<wchar_t,class StrTraitMFC_DLL<wchar_t,class ATL::ChTraitsCRT<wchar_t> > >)" (__imp_?sparse@@YA?AV?$CStringT@_WV?$StrTraitMFC_DLL@_WV?$ChTraitsCRT@_W@ATL@@@@@ATL@@V12@@Z) referenced in function "public: void __thiscall CGUI1Dlg::OnBnClickedButton1(void)" (?OnBnClickedButton1@CGUI1Dlg@@QAEXXZ)
1>C:\Documents and Settings\Администратор\Мои документы\Visual Studio 2008\Projects\GUI1\Debug\GUI1.exe : fatal error LNK1120: 1 unresolved externals
1>Build log was saved at "file://c:\Documents and Settings\Администратор\Мои документы\Visual Studio 2008\Projects\GUI1\GUI1\Debug\BuildLog.htm"
1>GUI1 - 2 error(s), 0 warning(s)


В dll 
Код

extern "C++" __declspec(dllexport) CString sparse(CString in_sql);

В проге
Код

extern "C++" __declspec(dllimport) CString sparse(CString in_sql);

Чую, грабли где-то рядом... но пока не знаю где ...
P.S. не спал(30 минут в день не считаю сном) около недели...

Библиотеку импорта при линковке не забыл подать?

Автор: Death_Master 21.6.2008, 02:09
Цитата(xvr @  20.6.2008,  11:40 Найти цитируемый пост)
Библиотеку импорта при линковке не забыл подать?

не забыл...


Цитата(EnergoHokum @  20.6.2008,  06:46 Найти цитируемый пост)
Так, а если попробовать динамическое связывание? Я обычно только с ним и работаю. 

Скинь пример кода, если не трудно...

Автор: EnergoHokum 23.6.2008, 08:28
Код

/* HANDLE подгружаемой библиотеки */
HMODULE hModule;
/* Определяем тип "указатель на функцию, возвращающую int
и принимающую const char*, void* и int" */
typedef __declspec(dllimport) int (*pS) (const char*,void*,int);
/* Создаём экземпляр этого типа */
pS pStart=NULL;
/* Загружаем DLL-ку в процесс */
hModule=::LoadLibrary("./loadercore.dll");
if(hModule == NULL)
{/* Неудача при загрузке библиотеки */
    /* Какой-нить код по обработке этой ошибки */
}
/* Получаем из неё указатель на функцию Start */
pStart=(pS)::GetProcAddress(hModule,"Start");
if(pStart == NULL)
{/* Не удалось получить адрес функции Start */
    /* Какой-нить код по обработке этой ошибки */
        if(::FreeLibrary(hModule) == 0)
        {/* Неудачное освобождение библиотеки загрузчика */
            /* Какой-нить код по обработке этой ошибки */
        }
}
/* Выполняем её */
if(pStart(ofn.lpstrFile,hWnd,sizeof(HWND)) != 0)
{/* Ошибка выполнения функции Start */
    /* Какой-нить код по обработке этой ошибки */
        if(::FreeLibrary(hModule) == 0)
        {/* Неудачное освобождение библиотеки загрузчика */
            /* Какой-нить код по обработке этой ошибки */
        }
}
/* Поработали с DLL-кой -- не забываем её выгрузить! */
if(::FreeLibrary(hModule) == 0)
{/* Неудачное освобождение библиотеки загрузчика */
    /* Какой-нить код по обработке этой ошибки */
}

Автор: xvr 23.6.2008, 10:46
Цитата(Death_Master @ 21.6.2008,  02:09)
Цитата(xvr @  20.6.2008,  11:40 Найти цитируемый пост)
Библиотеку импорта при линковке не забыл подать?

не забыл...

Тогда только внимательное исследование как библиотеки импорта, так и самой dll на предмет наличия требуемого символа. Исследовать с помощью dumpbin  smile 

Автор: Death_Master 23.6.2008, 11:19
Цитата(xvr @  23.6.2008,  10:46 Найти цитируемый пост)
Тогда только внимательное исследование как библиотеки импорта, так и самой dll на предмет наличия требуемого символа. Исследовать с помощью dumpbin  

символ есть...

Автор: xvr 23.6.2008, 11:39
Цитата(Death_Master @ 23.6.2008,  11:19)
Цитата(xvr @  23.6.2008,  10:46 Найти цитируемый пост)
Тогда только внимательное исследование как библиотеки импорта, так и самой dll на предмет наличия требуемого символа. Исследовать с помощью dumpbin  

символ есть...

Шайтан шайтан, могу посоветовать большой шаманский бубен, говорят помогает  smile 
Или давай файл проекта (.sln + .vcproj) - будем смотреть  smile 

Автор: Death_Master 24.6.2008, 16:59
Решил передачей побайтово чарами...
Ректально, но работает...

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)