Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Общие вопросы > Один объектный файл для приложения (exe) и библиот


Автор: NWhisper 10.1.2007, 11:12
Всем привет! Встал интересный вопрос, можно ли так сделать на 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?

Автор: En_t_end 10.1.2007, 16:38
ИМХО, если правильно понял вопрос.
Таблица экспорта создается в обьектном файле в момент его создания, т.е компиляции. Насколько я понял, в file1.obj в таблицы экспорта, если она вообще будет создана, явно не будет твоего метода.
Смысл таков, что не указав перед сборкой нужного файла какие функции экспортируются, они и не будут экспортироваться. В дальнейшем после компиляции это не изменить.

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

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

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

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

Автор: Earnest 10.1.2007, 20:46
Тогда функции всегда будут экспортироваться, а нужно чтобы они при построении 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). И, кажется, уже описывала это на форуме.

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