Модераторы: Daevaorn
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Один объектный файл для приложения (exe) и библиот 
:(
    Опции темы
NWhisper
Дата 10.1.2007, 11:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Всем привет! Встал интересный вопрос, можно ли так сделать на Visual C++?

Допустим, есть заголовочный файл:
//file1.h
Код

class API App
{
public:
    void foo();
}
 

И есть исходник:
//file1.cpp
Код

#define API
#include "file1.h"
void App::foo()
{}
 


После выполнения cl /MD file1.cpp получается файл file1.obj.

Далее, пишем еще один исходник:
//file2.cpp
Код

#define API __declspec(dllexport)
#include "file1.h"
 

После сборки этого исходника командой cl /LD /MD file2.cpp /link file.obj появляется file2.dll, которая не экспортирует App::foo.

Может кто-нибудь сказать почему не экспортируется App::foo?
PM MAIL   Вверх
En_t_end
Дата 10.1.2007, 16:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



ИМХО, если правильно понял вопрос.
Таблица экспорта создается в обьектном файле в момент его создания, т.е компиляции. Насколько я понял, в file1.obj в таблицы экспорта, если она вообще будет создана, явно не будет твоего метода.
Смысл таков, что не указав перед сборкой нужного файла какие функции экспортируются, они и не будут экспортироваться. В дальнейшем после компиляции это не изменить.
PM MAIL ICQ Skype GTalk Jabber   Вверх
Earnest
Дата 10.1.2007, 19:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



Цитата(NWhisper @  10.1.2007,  12:12 Найти цитируемый пост)
После сборки этого исходника командой cl /LD /MD file2.cpp /link file.obj появляется file2.dll, которая не экспортирует App::foo.

Откуда знаешь, что не экспортирует?
Попробуй в первом случае написать не
#define API
а
#define API __declspec(dllimport)



--------------------
...
PM   Вверх
Romikgy
Дата 10.1.2007, 20:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Любитель-программер
****


Профиль
Группа: Участник Клуба
Сообщений: 7326
Регистрация: 11.5.2005
Где: Porto Franco Odes sa

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



а че не написать 
Цитата(NWhisper @  10.1.2007,  10:12 Найти цитируемый пост)
#define API __declspec(dllexport)

один раз в хедерном файле?


--------------------
Владение русской орфографией это как владение кунг-фу — истинные мастера не применяют его без надобности. 
smile

PM   Вверх
Earnest
Дата 10.1.2007, 20:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



Тогда функции всегда будут экспортироваться, а нужно чтобы они при построении DLL экспортировались, а при построении EXE - импортировались.
Это стандартная техника, и все должно работать. Только удобнее делать примерно так:

Код

//MyDLLHeader.h
#ifdef _MYDLL
#define MYDLL_API __declspec(dllexport)
#else
#define MYDLL_API __declspec(dllimport)
#endif
  

Этот заголовок включается во все заголовочные файлы, которые описывают экспортирумые классы и функции MyDll. Кроме того, в настройках MyDLL прописывается символ препроцессора _MYDLL.
И все. Когда заголовок (один и тот же) подключается к MyDLL - функции экспортируются, когда к EXE или другим DLL - импортируются. Всю жизнь так делаю (ну почти  smile). И, кажется, уже описывала это на форуме.


--------------------
...
PM   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
Earnest Daevaorn

Добро пожаловать!

  • Черновик стандарта C++ (за октябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика(4.4мб).
  • Черновик стандарта C (за сентябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика (3.4мб).
  • Прежде чем задать вопрос, прочтите это и/или это!
  • Здесь хранится весь мировой запас ссылок на документы, связанные с C++ :)
  • Не брезгуйте пользоваться тегами [code=cpp][/code].
  • Пожалуйста, не просите написать за вас программы в этом разделе - для этого существует "Центр Помощи".
  • C++ FAQ

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn

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


 




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


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

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