Вместе с exe создается lib
От: said222  
Дата: 24.03.09 14:48
Оценка:
Появилась такая проблема:
Создал новый проект(Win32 Project) В нем только это:

int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow)
{
    return 0;
}

Пусть это будет проект "App"

Добавил к проекту пустую Dll

В ней объявляю класс, например так:

//File Foo.h

class __declspec(dllexport) Foo
{
    int mA;
public:
    Foo();
    void Add(int A);
};


Dll собирается нормально. Если в проект App добавить строчку

#include "Foo.h"


То при сборке проекта App появляется файл App.lib вместе с App.exe

Собственно вопрос — почему появляется App.lib, что я делаю не правильно.
PS: VS2005
Re: Вместе с exe создается lib
От: said222  
Дата: 24.03.09 14:54
Оценка:
Foo.lib естественно прилинковываю к App.exe
Re: Вместе с exe создается lib
От: Аноним  
Дата: 24.03.09 15:01
Оценка:
//File Foo.h

#ifdef _FOO_IMPLEMENTED
class __declspec(dllexport) Foo
#else
class __declspec(dllimport) Foo
#endif

ну и _FOO_IMPLEMENTED продефайнить для проета длл
Re[2]: Вместе с exe создается lib
От: said222  
Дата: 24.03.09 15:10
Оценка:
Здравствуйте, Аноним, Вы писали:

А>
А>//File Foo.h

А>#ifdef _FOO_IMPLEMENTED
А>class __declspec(dllexport) Foo
А>#else
А>class __declspec(dllimport) Foo
А>#endif
А>

А> ну и _FOO_IMPLEMENTED продефайнить для проета длл

Есть такая гадость:

#define FOO_DLL

#ifdef FOO_DLL
#define _Export    __declspec(dllexport)
#else
#define _Export    __declspec(dllimport)
#endif


Соответственно класс Foo объявляется как

class _Export Foo
{
  ...
}


В первом сообщении я намеренно написал __declspec(dllexport) вместо _Export
Re[3]: Вместе с exe создается lib
От: Аноним  
Дата: 24.03.09 16:04
Оценка:
В таком случае еще пара вопросов — .exe собирается? Работает нормально? Если да, то что вас беспокоит?
Re[4]: Вместе с exe создается lib
От: said222  
Дата: 24.03.09 16:13
Оценка:
Здравствуйте, Аноним, Вы писали:

А>В таком случае еще пара вопросов — .exe собирается? Работает нормально? Если да, то что вас беспокоит?


exe собирается, работает нормально, вроде как все хорошо, но ведь так же быть вроде не должно? Откуда вместе с exe еще и lib берется?
Re[5]: Вместе с exe создается lib
От: Аноним  
Дата: 24.03.09 16:20
Оценка:
А>>В таком случае еще пара вопросов — .exe собирается? Работает нормально? Если да, то что вас беспокоит?
S>exe собирается, работает нормально, вроде как все хорошо, но ведь так же быть вроде не должно? Откуда вместе с exe еще и lib берется?
Почему бы и нет? .exe это такой же PE файл как и .dll и тоже может иметь экспортные символы на которые могут линковаться вгружаемые в него длл.
Re[3]: Вместе с exe создается lib
От: superlexx  
Дата: 25.03.09 05:51
Оценка:
Здравствуйте, said222, Вы писали:

S>Есть такая гадость:


S>
S>#define FOO_DLL

S>#ifdef FOO_DLL
S>#define _Export    __declspec(dllexport)
S>#else
S>#define _Export    __declspec(dllimport)
S>#endif
S>


.lib от exe у Вас быть не должно.

#define FOO_DLL

должна быть только в dll (она экспортирует), тогда App увидит __declspec(dllimport) и libы не появится.
Re[4]: Вместе с exe создается lib
От: said222  
Дата: 25.03.09 08:02
Оценка:
Здравствуйте, superlexx, Вы писали:

S>Здравствуйте, said222, Вы писали:


S>>Есть такая гадость:


S>>
S>>#define FOO_DLL

S>>#ifdef FOO_DLL
S>>#define _Export    __declspec(dllexport)
S>>#else
S>>#define _Export    __declspec(dllimport)
S>>#endif
S>>


S>.lib от exe у Вас быть не должно.


S>
#define FOO_DLL

S>должна быть только в dll (она экспортирует), тогда App увидит __declspec(dllimport) и libы не появится.

Почти как собака — понимать это понимаю, а как применить не знаю.

Т.е. чтобы класс в dll увидел, что такое _Export, нужно включить файл с описанием _Export в заголовок файла объявлением класса. Когда заголовок с классом включаю в ехе, автоматически включается и #define FOO_DLL с описанием _Export. Пробовал добавить в ехе след. строчки, но ничего не изменилось

#ifdef FOO_DLL
   #undef FOO_DLL
#endif
Re[5]: Вместе с exe создается lib
От: superlexx  
Дата: 25.03.09 09:42
Оценка:
если я правильно понял, то
есть:
// app.cpp
#ifdef FOO_DLL
   #undef FOO_DLL
#endif

#include "foo.h"
// end of app.cpp

// foo.cpp
#include "foo.h"
// end of foo.cpp

// foo.h
#define FOO_DLL

#ifdef FOO_DLL
#define _Export    __declspec(dllexport)
#else
#define _Export    __declspec(dllimport)
#endif

class _Export Foo
{
  //...
}
// end of foo.h

должно быть:
// app.cpp
#include "foo.h"
// end of app.cpp

// foo.cpp
#define FOO_DLL
#include "foo.h"
// end of foo.cpp

// foo.h
#ifdef FOO_DLL
#define _Export    __declspec(dllexport)
#else
#define _Export    __declspec(dllimport)
#endif

class _Export Foo
{
  //...
}
// end of foo.h
Re[5]: Вместе с exe создается lib
От: said222  
Дата: 25.03.09 09:42
Оценка:
Вписал определение FOO_DLL в настройки dll и все заработало как надо.
Всем откликнувшимся огромное спасибо!!!
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.