Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

Восстановить пароль

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 06.08.2011, 19:03   #1
MooNDeaR
В стагнации
Участник клуба
 
Аватар для MooNDeaR
 
Регистрация: 29.07.2011
Сообщений: 1,303
По умолчанию Вопрос: Классы и библиотеки. Использование.

Вот я прочитал вот эту темку http://programmersforum.ru/showthread.php?t=38078.

Там показано как переносить функции в библиотеки.

Но при написании в .h файле библиотеки вот такого кода
Код:
...
extern "C" _declspec(dllexport) class A;
...
в .cpp файле вот такого:
Код:
...
extern "C" _declspec(dllexport) class A{
	int health;
public:
	A(int he = 100);
};

A::A(int he) {health = he;}
всё линкуется и пр. Но когда я подключаю эту библиотеку и пишу

Код:
...
A ObjA;
...
Он матюкается благим матом. Пишет ObjA использует неопределенный класс А

Отчего я пришел к выводу что с классами не всё так просто.

P.S. хотелось бы знать что значит это "C"
E-mail: pashaworking@gmail.com | ICQ: 479914426 | Skype: moondearr
Понять, чего от тебя требует заказчик – это уже половина всей работы, а иногда и полностью выполненное задание.
MooNDeaR вне форума Ответить с цитированием
Старый 06.08.2011, 19:06   #2
Пепел Феникса
Старожил
 
Аватар для Пепел Феникса
 
Регистрация: 28.01.2009
Сообщений: 21,000
По умолчанию

а вы хидер то подключили?(вообще обычно условно делают выбор между dllimport и dllexport, так как при подключении в проекте нужен импорт)
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел.
Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите.
Пепел Феникса вне форума Ответить с цитированием
Старый 06.08.2011, 19:12   #3
MooNDeaR
В стагнации
Участник клуба
 
Аватар для MooNDeaR
 
Регистрация: 29.07.2011
Сообщений: 1,303
По умолчанию

Цитата:
Сообщение от Пепел Феникса Посмотреть сообщение
а вы хидер то подключили?(вообще обычно условно делают выбор между dllimport и dllexport, так как при подключении в проекте нужен импорт)
С этого места поподробней. Я ужасный ламер вот что я понял. Пойду книги читать. Что такое хидер? И в чем "условные" различия между dllexport и dllimport ? Как я понимаю что export - для того чтобы экспортировать из библиотеки, import - чтобы импортировать в библиотеку.
E-mail: pashaworking@gmail.com | ICQ: 479914426 | Skype: moondearr
Понять, чего от тебя требует заказчик – это уже половина всей работы, а иногда и полностью выполненное задание.
MooNDeaR вне форума Ответить с цитированием
Старый 06.08.2011, 19:27   #4
Пепел Феникса
Старожил
 
Аватар для Пепел Феникса
 
Регистрация: 28.01.2009
Сообщений: 21,000
По умолчанию

хидер==заголовочник==.h файл.
Цитата:
чтобы импортировать в библиотеку.
из библиотеки только.
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел.
Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите.
Пепел Феникса вне форума Ответить с цитированием
Старый 06.08.2011, 19:57   #5
MooNDeaR
В стагнации
Участник клуба
 
Аватар для MooNDeaR
 
Регистрация: 29.07.2011
Сообщений: 1,303
По умолчанию

Цитата:
Сообщение от Пепел Феникса Посмотреть сообщение
хидер==заголовочник==.h файл.
ааа, вы про это. Дык вставил я его.

Цитата:
из библиотеки только.
Ладно, допустим. Тогда в чем разница между export и import? Когда использовать одно, а когда другое?

Но по-большому счету это второстепенный вопрос. Основной-то не решен.
Еще вот увидал сообщение

__declspec(dllexport): пропускается слева от "A", когда ни одна переменная не объявлена

чтобы это могло значить?
E-mail: pashaworking@gmail.com | ICQ: 479914426 | Skype: moondearr
Понять, чего от тебя требует заказчик – это уже половина всей работы, а иногда и полностью выполненное задание.
MooNDeaR вне форума Ответить с цитированием
Старый 06.08.2011, 20:58   #6
Пепел Феникса
Старожил
 
Аватар для Пепел Феникса
 
Регистрация: 28.01.2009
Сообщений: 21,000
По умолчанию

в библиотеке должно быть dllexport, а в приложении использующем библиотеку должно быть dllimport.

вот набросал пример:
состоит из двух проектов:
ДЛЛ dlltest.h(LIBTESTBUILD я указал вручную в настройках проекта(С++/Препроцессор))
Код:
#ifdef LIBTESTBUILD
#define DLL_IMPORT __declspec(dllexport)
#else 
#define DLL_IMPORT __declspec(dllimport)
#endif

class Test
{
public:
	DLL_IMPORT char* get();
};
ДЛЛ main.cpp
Код:
#include "dlltest.h"

char* Test::get()
{
	return "Hello from DLL!";
}
вот и весь проект длл.

ПРИЛОЖЕНИЕ main.cpp
Код:
#include <iostream>
#include "dlltest.h"

using namespace std;

int main()
{
	Test a;
	cout<<a.get()<<endl;
}
соответственно dlltest.h и lib-файл от dll были скопированы в папку проекта.
так же dll была перед запуском перенесена в папку с приложением.
Цитата:
чтобы это могло значить?
а значит это то, что сам класс не может экспортироватся, а экспортируются методы.
а так же еще переменные можно экспортировать.
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел.
Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите.
Пепел Феникса вне форума Ответить с цитированием
Старый 06.08.2011, 21:17   #7
MooNDeaR
В стагнации
Участник клуба
 
Аватар для MooNDeaR
 
Регистрация: 29.07.2011
Сообщений: 1,303
По умолчанию

Цитата:
ДЛЛ dlltest.h(LIBTESTBUILD я указал вручную в настройках проекта(С++/Препроцессор))
Не нашел где там это сделать, что в принципе меня не особо смутило, т.к. её можно задефайнить в main.cpp для DLL.

Смутило другое, почему об этом ничего не было сказано в теме про ДЛЛ

И еще:
Код:
#include <iostream>
#include "dlltest.h"

using namespace std;

int main()
{
	Test a;
	cout<<a.get()<<endl;
}
А в main.cpp приложения не надо писать

Код:
#pragma comment(lib,"dlltest.lib")
E-mail: pashaworking@gmail.com | ICQ: 479914426 | Skype: moondearr
Понять, чего от тебя требует заказчик – это уже половина всей работы, а иногда и полностью выполненное задание.

Последний раз редактировалось MooNDeaR; 06.08.2011 в 21:24.
MooNDeaR вне форума Ответить с цитированием
Старый 06.08.2011, 21:25   #8
Пепел Феникса
Старожил
 
Аватар для Пепел Феникса
 
Регистрация: 28.01.2009
Сообщений: 21,000
По умолчанию

Цитата:
разве не надо?
если в настройках проекта не указали то надо.(я в настройках проекта указывал, извините что забыл сказать)
я просто привык с gcc работать, там это не канает.
Цитата:
Смутило другое, почему об этом ничего не было сказано в теме про ДЛЛ
в студии и экспорт канает и там и там(странно...)
а extern "C" нужно чтоб имя не портачилось, но в случае с классами не надо ставить(классы итак только в пределах одного компиля работать будут).
Цитата:
Не нашел где там это сделать, что в принципе меня не особо смутило
либо в обозревателе решений правой кнопкой по проекту и там свойства
либо вверху проект/свойства
далее Свойства конфигурации=>С/C++=>Препроцессор=>Определения препроцессора
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел.
Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите.

Последний раз редактировалось Пепел Феникса; 06.08.2011 в 21:28.
Пепел Феникса вне форума Ответить с цитированием
Старый 06.08.2011, 23:01   #9
MooNDeaR
В стагнации
Участник клуба
 
Аватар для MooNDeaR
 
Регистрация: 29.07.2011
Сообщений: 1,303
По умолчанию

Т.е. получается классы непересносимы?

Спасибо, кстати за помощь
E-mail: pashaworking@gmail.com | ICQ: 479914426 | Skype: moondearr
Понять, чего от тебя требует заказчик – это уже половина всей работы, а иногда и полностью выполненное задание.
MooNDeaR вне форума Ответить с цитированием
Старый 07.08.2011, 01:33   #10
Пепел Феникса
Старожил
 
Аватар для Пепел Феникса
 
Регистрация: 28.01.2009
Сообщений: 21,000
По умолчанию

экспорт методов каждый компиль реализует по своему.
да и между компилями такие вещи не должны быть переносимы.
просто функции можно сделать переносимыми(даже между ЯП)

кстати, а зачем длл то?
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел.
Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите.
Пепел Феникса вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Использование библиотеки <stdio.h> Ame Помощь студентам 0 11.05.2011 22:32
Использование библиотеки C и C++ demon9992 Помощь студентам 3 30.03.2011 22:14
Создание и использование библиотеки DLL Blew Помощь студентам 0 06.02.2011 14:56
теоретическая программа с использование библиотеки mpi Kodeks Общие вопросы C/C++ 0 29.11.2010 07:45
Классы vs. функции (вопрос, а не холивар) Qousio Общие вопросы C/C++ 7 21.05.2009 18:00