Поиск:

Ответ в темуСоздание новой темы Создание опроса
> DLL+Release — Unresolved external... 
:(
    Опции темы
kometa_triatlon
Дата 24.11.2005, 23:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 384
Регистрация: 7.1.2005
Где: Киев

Репутация: 1
Всего: 6



Есть проект, использующий неявное подключение ДЛЛ.
В класс dll запихнул нужные мне функции, приложение получает результат работы через вспомогательную функцию. Вроде все ничего, но как обычно, в дебаге работает нормально, в версии release не билдится smile
Получаю следующее:

Код

lab1 error LNK2019: unresolved external symbol "__declspec(dllimport) class CObArray * __cdecl Run(class ATL::CStringT<char,class StrTraitMFC<char,class ATL::ChTraitsCRT<char> > > *,int)" (__imp_?Run@@YAPAVCObArray@@PAV?$CStringT@DV?$StrTraitMFC@DV?$ChTraitsCRT@D@ATL@@@@@ATL@@H@Z) referenced in function "public: void __thiscall CMyDlg::OnToolsRun(void)" (?OnToolsRun@CMyDlg@@QAEXXZ)


Некоторые части кода вот:
Объявление импортируемой функции:
Код

__declspec (dllimport) CObArray* Run(CString*, int );


В dll:
Код

#include "resource.h"        // main symbols
#include "afxcoll.h"
#include "VarItem.h"


// CanalyserApp
// See analyser.cpp for the implementation of this class
//
enum SUBPROG_TYPE { FUNCTION, PROCEDURE }; 

class CanalyserApp : public CWinApp
{
public:
    CanalyserApp();

// Overrides
public:
    virtual BOOL InitInstance();

    DECLARE_MESSAGE_MAP()
private:
    CString* m_arrStrCode;
    int m_iLineCount;
    CObArray m_arrVarList;
public:
    CObArray* AnalyseCode(CString* strCode, int iLineCount);

private:
    void GetVarsFromInit(CString strVars, VARSTATE state, int iLine, char lpszType[10],  CString strSubProgName = PRIMARY_PROG);
    bool ConformFormat(CString strLine, CString strFormat);
    void GetVarsFromParameters(CString strLine, VARSTATE state, int iLine, CString strSubprogName);
    CString GetSubprogName(SUBPROG_TYPE type, CString);
};

 __declspec (dllexport) CObArray* Run(CString* strCode, int iLineCount);


Код

__declspec (dllexport) CObArray* Run(CString* strCode, int iLineCount)
{
    return theApp.AnalyseCode(strCode, iLineCount);
}

Проблема конечно более чем распространенная, но в поиске не нашел... Может мне как-то переписать код?


--------------------
Всё очень просто: сказки обман,
Солнечный остров скрылся в туман,
Замков воздушных не носит земля,
Кто-то ошибся, ты или я.

--------------
Программирование - самое большое удовольствие, которое вы можете получить, будучи одетым.
PM MAIL ICQ   Вверх
AlexPro
Дата 25.11.2005, 05:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 157
Регистрация: 9.11.2005
Где: Санкт-Петербург

Репутация: 3
Всего: 4



Если склероз мне не изменяет, в свое время у меня у меня тоже было нечто подобное, сейчас использую def-файл для экспортируемых функций - работает на ура. smile
PM MAIL   Вверх
nikf
Дата 25.11.2005, 07:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 127
Регистрация: 6.6.2005
Где: город-герой Жирно вск

Репутация: 1
Всего: 1



дело не в коде. линкер видит объявленную функцию в h файле, но не видит ее реализации... где-то потерялись твоя dll... или забыл подсоединить библиотеку импорта .lib. просто повнимательнее посмотри. dll должна быть в папке куда компилишь релиз екзешника.
Добавлено @ 07:48
или в релизие твоему екзешнику попадается старая версия dll не содержащая данной функции
PM MAIL   Вверх
kometa_triatlon
Дата 26.11.2005, 00:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 384
Регистрация: 7.1.2005
Где: Киев

Репутация: 1
Всего: 6



А ведь точно, я в дебаге настроил директории, указал путь к библиотеке импорта, думал, что для релиза эти настройки сохранятся, оказалось все не так радужно...
Спасибо nikf за трезвую идею smile


--------------------
Всё очень просто: сказки обман,
Солнечный остров скрылся в туман,
Замков воздушных не носит земля,
Кто-то ошибся, ты или я.

--------------
Программирование - самое большое удовольствие, которое вы можете получить, будучи одетым.
PM MAIL ICQ   Вверх
En_t_end
Дата 26.11.2005, 07:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник Клуба
Сообщений: 2074
Регистрация: 4.12.2004

Репутация: 2
Всего: 20



kometa_triatlon
Если я тебя правильно понял, то советую в таком случае все либы подключать прямо, а не в настройке проекта... #pragma comment(lib,"some.lib")
PM MAIL ICQ Skype GTalk Jabber   Вверх
kometa_triatlon
Дата 26.11.2005, 17:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 384
Регистрация: 7.1.2005
Где: Киев

Репутация: 1
Всего: 6



En_t_end
Ок, но у меня output directory для проекта dll-ки указана не как обычно, а на уровень выше. Как это можно указать в коде?


--------------------
Всё очень просто: сказки обман,
Солнечный остров скрылся в туман,
Замков воздушных не носит земля,
Кто-то ошибся, ты или я.

--------------
Программирование - самое большое удовольствие, которое вы можете получить, будучи одетым.
PM MAIL ICQ   Вверх
AlexPro
Дата 27.11.2005, 04:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 157
Регистрация: 9.11.2005
Где: Санкт-Петербург

Репутация: 3
Всего: 4



Цитата(kometa_triatlon @ 26.11.2005, 00:33)
я в дебаге настроил директории, указал путь к библиотеке импорта, думал, что для релиза эти настройки сохранятся, оказалось все не так радужно

Очень даже радужно smile. Достаточно в свойствах проекта выбрать All configurations - и изменяемые тобой настройки будут иметь место во всех твоих восьми с половиной сборках (включая Debug и Release).
PM MAIL   Вверх
DeadSoul
Дата 27.11.2005, 13:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Участник
Сообщений: 1217
Регистрация: 25.9.2005
Где: Москва

Репутация: 2
Всего: 11



kometa_triatlon, была такая бага. Долго пиииииииииииииип. У тебя неправильно(а вернее по разному) указаны настройки проекта в dll и exe. Нужно выставить одинаковыми:
- Project -> Properties -> General -> Character Set
- Project -> Properties -> C\C++ -> Language -> Treat wchar_t as build-in type



--------------------
 Если Вы получили ответ на Ваш вопрос, то нажмите на "Вопрос решен". 

Бьем спамеров их же оружием. Пусть весь спам сыпется им
[email protected] 
PM   Вверх
kometa_triatlon
Дата 30.11.2005, 00:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 384
Регистрация: 7.1.2005
Где: Киев

Репутация: 1
Всего: 6



Вопрос в догонку: как экспортировать из библиотеки только один метод класса:
Я сделал так: объявил в библиотеке экспортируемую функцию
Код

 __declspec (dllexport) CPtrArray* Run(CString* strCode, int iLineCount);

но она только вызывает метод класса:
Код

__declspec (dllexport) CPtrArray* Run(CString* strCode, int iLineCount)
{
    return theApp.AnalyseCode(strCode, iLineCount);
}


Почитал МСДН, переделал так:
Код

class CanalyserApp : public CWinApp
{
public:
    CanalyserApp();

// Overrides
public:
    virtual BOOL InitInstance();

    DECLARE_MESSAGE_MAP()
private:
    CString* m_arrStrCode;
    int m_iLineCount;
    CPtrArray m_arrVarList;
public:


    AFX_EXT_CLASS CPtrArray* AnalyseCode(CString* strCode, int iLineCount);



private:
    void GetVarsFromInit(CString strVars, VARSTATE state, int iLine, char lpszType[10],  CString strSubProgName = PRIMARY_PROG);
    bool ConformFormat(CString strLine, CString strFormat);
    void GetVarsFromParameters(CString strLine, VARSTATE state, int iLine, CString strSubprogName);
    CString GetSubprogName(SUBPROG_TYPE type, CString);
};


AFX_EXT_CLASS CPtrArray* CanalyserApp::AnalyseCode(CString* strCode, int iLineCount)
{ ....

Но не пойму теперь как обьявить этот метод для клиента, раньше было просто:

Код

__declspec (dllimport) CPtrArray* Run(CString*, int );

Если оставить как есть, получаю unresolved, заменяю __declspec (dllimport) на AFX_EXT_CLASS то же самое smile
Что-то не нашел в МСДН такого...


--------------------
Всё очень просто: сказки обман,
Солнечный остров скрылся в туман,
Замков воздушных не носит земля,
Кто-то ошибся, ты или я.

--------------
Программирование - самое большое удовольствие, которое вы можете получить, будучи одетым.
PM MAIL ICQ   Вверх
bel_nikita
Дата 30.11.2005, 00:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Эксперт
Сообщений: 2304
Регистрация: 12.10.2003
Где: Поезд №21/22 ( ст . Прага )

Репутация: 2
Всего: 47



kometa_triatlon
Цитата
Вроде все ничего, но как обычно, в дебаге работает нормально, в версии release не билдится
Для релиз ЕХЕ должны быть релиз DLL и также для дебаг EXE должен быть DLL.

Что в препроцессоре прописано?
Чтобы экспортировать MFC класы из DLL - она должна быть MFC extension DLL.


--------------------
user posted image — регистрация доменов от 150 руб.
PM MAIL WWW ICQ   Вверх
kometa_triatlon
Дата 30.11.2005, 00:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 384
Регистрация: 7.1.2005
Где: Киев

Репутация: 1
Всего: 6



bel_nikita
Ту проблему я уже решил

Я так понял, если я экспортирую только один метод класса, все равно DLL должна быть расширенной?


--------------------
Всё очень просто: сказки обман,
Солнечный остров скрылся в туман,
Замков воздушных не носит земля,
Кто-то ошибся, ты или я.

--------------
Программирование - самое большое удовольствие, которое вы можете получить, будучи одетым.
PM MAIL ICQ   Вверх
bel_nikita
Дата 30.11.2005, 01:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Эксперт
Сообщений: 2304
Регистрация: 12.10.2003
Где: Поезд №21/22 ( ст . Прага )

Репутация: 2
Всего: 47



Цитата(kometa_triatlon @ 29.11.2005, 23:47)
Я так понял, если я экспортирую только один метод класса, все равно DLL должна быть расширенной?

Что значит экспортировать метод класса??? Можно либо весь класс экспортировать, либо неклассовые методы, либо переменные.


--------------------
user posted image — регистрация доменов от 150 руб.
PM MAIL WWW ICQ   Вверх
Earnest
Дата 30.11.2005, 09:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Экс. модератор
Сообщений: 5962
Регистрация: 17.6.2005
Где: Рязань

Репутация: 87
Всего: 183



bel_nikita ты абсолютно не прав...
Можно экспортировать как все методы класса, так и только выбранные.
В первом случае спецификация экспорта-импорта ставится в определении класса, во- втором - только в определении метода, как в примере у kometa_triatlon.

Цитата(kometa_triatlon @ 30.11.2005, 00:47)
Я так понял, если я экспортирую только один метод класса, все равно DLL должна быть расширенной

Нет, не в этом дело. Просто когда визард создает extension DLL, он добавляет символ препроцессора _AFXEXT, а этот символ нужен для правильной интерпретации символов AFX_EXT_CLASS и т.д. Т.е., если есть _AFXEXT, то AFX_EXT_CLASS == declspec(dllimport), в противном случае - export. Можешь сам таких символов сочинить для каждой своей DLL, не важно, extension или нет.


--------------------
...
PM   Вверх
bel_nikita
Дата 30.11.2005, 10:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Эксперт
Сообщений: 2304
Регистрация: 12.10.2003
Где: Поезд №21/22 ( ст . Прага )

Репутация: 2
Всего: 47



Точно. Век живи - век учись smile Только еще конструктор с собой цеплять нужно, ну экпортировать т.е.


--------------------
user posted image — регистрация доменов от 150 руб.
PM MAIL WWW ICQ   Вверх
Earnest
Дата 30.11.2005, 18:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Экс. модератор
Сообщений: 5962
Регистрация: 17.6.2005
Где: Рязань

Репутация: 87
Всего: 183



Цитата(bel_nikita @ 30.11.2005, 10:40)
Только еще конструктор с собой цеплять нужно, ну экпортировать т.е.

Совершенно не обязательно, если ты не конструируешь объект в клиентском коде, а, скажем, получаешь ссылку на готовый объект. Короче, что вызывается в клиенте, то и нужно экспортировать.

Спасибо тебе за репу.



--------------------
...
PM   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Visual C++/MFC/WTL | Следующая тема »


 




[ Время генерации скрипта: 0.0578 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.