ПрограммированиеФорумОбщее

Вопрос по динамической библиотеке (c++)

#0
11:11, 21 апр 2011

Вот разбираюсь как их делать. Создал новый солюшен в студии (пустое консольное приложение->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 кб. Это конечно не критично, но хочу чтобы он не создавался - как?

#1
11:15, 21 апр 2011

warchief
> Что вообще пишется в test.lib?

Библиотека импорта же, для передачи тем, кто будет твою dll использовать.

#2
11:17, 21 апр 2011

warchief
> Что вообще пишется в test.lib?
Это библиотека импорта...

warchief
> Это конечно не критично, но хочу чтобы он не создавался - как?
Можно отключить где-то в настройках проекта... (сейчас лень студию открывать)

#3
11:20, 21 апр 2011

Какое связывание нужно, динамическое или статическое?

#4
11:30, 21 апр 2011

>>Библиотека импорта же, для передачи тем, кто будет твою dll использовать.
>>Это библиотека импорта...
Не понял... для тех приложений которые будут использовать dll создается
>>Creating library ..\2DWCEngine.lib and object ..\2DWCEngine.exp
А для чего создается вторая, я не понял, с кем мне связывать test.exe?
>> Creating library ..\test.lib and object ..\test.exp

Динамическое связывание

#5
11:34, 21 апр 2011

То есть у меня создается 2DWCEngine.dll, 2DWCEngine.lib и test.exe, test.lib и вот на кой мне этот последний файл я и думаю.

Может проблема где-то в header? У меня есть engine.h в котором инклудятся все header движка в которых везде и стоит ENGINE_API в объявлениях. test инклудит этот самый engine.h.

#6
12:37, 21 апр 2011

Если генерится lib файл, значит test.exe экспортирует какие-то функции наружу (что легко проверить). Скорее всего через __declspec(dllexport) директивы в хедерах движка.

#7
12:53, 21 апр 2011

Crazy Hamster
Я тоже так думаю, но как сделать чтобы такое не происходило? Если в движке убрать директивы __declspec(dllexport) то test не соберется... Как сделать чтобы test не обращал внимание на __declspec(dllexport) из движка?

#8
12:59, 21 апр 2011

warchief
> сли в движке убрать директивы __declspec(dllexport)

написать __declspec(dllimport)  ?  Через #ifdef естественно, чтобы при компиляции DLL брались dllexport, а при подключении заголовочного файла в другой проект, - dllimport

#9
13:16, 21 апр 2011

warchief
Как то так можно.

#ifdef _ENGINE_BUILD_
#   define ENGINE_API  __declspec(dllexport)
#else
#   define ENGINE_API __declspec(dllimport)
#endif

И определить _ENGINE_BUILD_ в настройках проекта движка.

#10
4:49, 22 апр 2011

Crazy Hamster
Так сразу было, в движке был прописан дефайн (в настройках проекта), но почему-то при компиляции он не виделся и движок компилировался с таким
>># define ENGINE_API __declspec(dllimport)
Я это проверил просто, убрал #else #define ENGINE_API __declspec(dllimport) и компилятор стал ругаться что такого дефайна нет...

Хотя сейчас попробую еще раз (а то не знал что этот код делает)

ПрограммированиеФорумОбщее

Тема в архиве.