Вот разбираюсь как их делать. Создал новый солюшен в студии (пустое консольное приложение->dll). Закинул весь код своего движка, создал dll_setup.h с таким кодом:
#pragma once
#define ENGINE_API __declspec(dllexport)
Везде в объявлениях поставил ENGINE_API. Скомпилировал. все нормально. Создаю в этом же солюшне тестовое приложение, линкую его с моим движком, пишу код, компилирую и получаю это
------ Rebuild All started: Project: 2DWCEngine, Configuration: Release Win32 ------ Deleting intermediate and output files for project '2DWCEngine', configuration 'Release|Win32' Compiling... timer.cpp Log.cpp image_util.cpp Image.cpp global.cpp Framework.cpp FPS.cpp EventHandler.cpp Engine.cpp dll_setup.cpp Display.cpp Compiling... SDL_rotozoom.c SDL_gfxPrimitives.c Compiling resources... Linking... Creating library ..\2DWCEngine.lib and object ..\2DWCEngine.exp Generating code Finished generating code Embedding manifest... Build log was saved at "file://f:\Документы\Visual Studio 2005\2DWCEngine\2DWCEngine\Release\BuildLog.htm" 2DWCEngine - 0 error(s), 11 warning(s) ------ Rebuild All started: Project: test, Configuration: Release Win32 ------ Deleting intermediate and output files for project 'test', configuration 'Release|Win32' Compiling... test_engine.cpp Linking... Creating library ..\test.lib and object ..\test.exp Generating code Finished generating code Embedding manifest... Build log was saved at "file://f:\Документы\Visual Studio 2005\2DWCEngine\test\Release\BuildLog.htm" test - 0 error(s), 0 warning(s) ========== Rebuild All: 2 succeeded, 0 failed, 0 skipped ==========
Вопрос собственно - зачем вот это делается и почему:
Linking...
Creating library ..\test.lib and object ..\test.exp
Мой движок 2DWCEngine.dll. Что вообще пишется в test.lib? И откуда он вообще берется? Размер 2DWCEngine.lib - 19.6 кб. размер test.lib - 3.56 кб. Это конечно не критично, но хочу чтобы он не создавался - как?
warchief
> Что вообще пишется в test.lib?
Библиотека импорта же, для передачи тем, кто будет твою dll использовать.
warchief
> Что вообще пишется в test.lib?
Это библиотека импорта...
warchief
> Это конечно не критично, но хочу чтобы он не создавался - как?
Можно отключить где-то в настройках проекта... (сейчас лень студию открывать)
Какое связывание нужно, динамическое или статическое?
>>Библиотека импорта же, для передачи тем, кто будет твою dll использовать.
>>Это библиотека импорта...
Не понял... для тех приложений которые будут использовать dll создается
>>Creating library ..\2DWCEngine.lib and object ..\2DWCEngine.exp
А для чего создается вторая, я не понял, с кем мне связывать test.exe?
>> Creating library ..\test.lib and object ..\test.exp
Динамическое связывание
То есть у меня создается 2DWCEngine.dll, 2DWCEngine.lib и test.exe, test.lib и вот на кой мне этот последний файл я и думаю.
Может проблема где-то в header? У меня есть engine.h в котором инклудятся все header движка в которых везде и стоит ENGINE_API в объявлениях. test инклудит этот самый engine.h.
Если генерится lib файл, значит test.exe экспортирует какие-то функции наружу (что легко проверить). Скорее всего через __declspec(dllexport) директивы в хедерах движка.
Crazy Hamster
Я тоже так думаю, но как сделать чтобы такое не происходило? Если в движке убрать директивы __declspec(dllexport) то test не соберется... Как сделать чтобы test не обращал внимание на __declspec(dllexport) из движка?
warchief
> сли в движке убрать директивы __declspec(dllexport)
написать __declspec(dllimport) ? Через #ifdef естественно, чтобы при компиляции DLL брались dllexport, а при подключении заголовочного файла в другой проект, - dllimport
warchief
Как то так можно.
#ifdef _ENGINE_BUILD_ # define ENGINE_API __declspec(dllexport) #else # define ENGINE_API __declspec(dllimport) #endif
И определить _ENGINE_BUILD_ в настройках проекта движка.
Crazy Hamster
Так сразу было, в движке был прописан дефайн (в настройках проекта), но почему-то при компиляции он не виделся и движок компилировался с таким
>># define ENGINE_API __declspec(dllimport)
Я это проверил просто, убрал #else #define ENGINE_API __declspec(dllimport) и компилятор стал ругаться что такого дефайна нет...
Хотя сейчас попробую еще раз (а то не знал что этот код делает)
Тема в архиве.