elradziu Temat założony przez niniejszego użytkownika |
Pytanie odnośnie bibliotek DLL » 2015-09-10 18:04:38 Mam takie pytanie mając pewną bibliotekę DLL która zawiera funkcje np. SUMA czy można tą bibliotekę dodać do innej biblioteki DLL? W skrócie mówiąc chcę by jedna biblioteka DLL korzystała z innej. Na razie robię to w ten sposób że tworze bibliotekę z funkcją SUMA. Potem tworzę drugą bibliotekę z inną funkcją która odwołuje się do tej pierwszej. Robię to tak samo jak bym statycznie linkował bibliotekę w aplikacji exe. Tylko że wywala mi błąd że funkcja SUMA jest nie zdeklarowana w tym projekcie. Oto kod: Plik main2.cpp: #include "main2.h" #include "main.h"
void DLL_EXPORT SomeFunction( const LPCSTR sometext ) { MessageBoxA( 0, sometext, "DLL Message", MB_OK | MB_ICONINFORMATION ); }
extern "C" DLL_EXPORT BOOL APIENTRY DllMain( HINSTANCE hinstDLL, DWORD fdwReason, LPVOID lpvReserved ) { switch( fdwReason ) { case DLL_PROCESS_ATTACH: break; case DLL_PROCESS_DETACH: break; case DLL_THREAD_ATTACH: break; case DLL_THREAD_DETACH: break; } return TRUE; } int funkcja( int a ) { return Suma( a, a ); }
Plik main2.h: #ifndef __MAIN_H__ #define __MAIN_H__
#include <windows.h>
#ifdef BUILD_DLL #define DLL_EXPORT __declspec(dllexport) #else #define DLL_EXPORT __declspec(dllimport) #endif
#ifdef __cplusplus extern "C" { #endif void DLL_EXPORT SomeFunction( const LPCSTR sometext ); int DLL_EXPORT funkcja( int a ); #ifdef __cplusplus } #endif
#endif
|
|
DejaVu |
» 2015-09-10 20:01:59 Da się, ale najpierw proponuję abyś spróbował dobrze zrozumieć zagadnienie zależności Twoja aplikacja korzystająca z Twojej dll-ki. Z kodu, który wkleiłeś wynika, że nie rozumiesz jak to działa i sklejasz bezmyślnie fragmenty z różnych tutoriali. |
|
elradziu Temat założony przez niniejszego użytkownika |
» 2015-09-11 19:14:26 Ok wiem że da się to zrobić przy linkowaniu dynamicznym. Zrobiłem tak i działa. Ale pytanie czy przy linkowaniu statycznym jest taka możliwość jeżeli tak to jak to wykonać? Linkowanie statyczne w przypadku dużych bibliotek ma ten plus że kompilator na podstawie pliku nagłówkowego z biblioteki daje podpowiedzi, czyli nie trzeba pamiętać ile i jakich typów zmiennych dana funkcja używa. Ponad to jeżeli jakaś biblioteka posiada dużo funkcji, a my chcemy z nich korzystać dynamicznie to wtedy trzeba do każdej tworzyć wskaźnik. Co jest raczej mało wygodne. Więc może jakaś podpowiedź DejaVu? |
|
DejaVu |
» 2015-09-13 00:00:04 Sposób linkowania kodu nie ma wpływu na intellisense. Po prostu trzeba kod pisać poprawnie. Najlepszym przykładem, że się da jest SFML. Biblioteka do dźwięku SFML-a jest dll-ką, która jest zależna od innej DLL-ki (openAL), a aplikacja korzysta z bibliotek SFML-owych i nigdzie nie określa się dodatkowych zależności, choć one istnieją. |
|
elradziu Temat założony przez niniejszego użytkownika |
» 2015-09-17 08:48:18 Szczerze powiem że nie bardzo wiem gdzie popełniam bład, bo jedyna różnica między poprzednim wykorzystywaniem dll a aktualną jest taka że wcześniej biblioteka dll (z własnymi funkcjami) została wykorzystywana w kodzie źródłowym pliku *exe. A teraz chcę tą samą bibliotekę wykorzystać przez inną. Czynności wykonuję te same i naprawdę nie mogę dojść do tego jaka ma być różnica w kodzie gdy bibliotekę chcę wykorzystać przez inną DLL. Jedyne co mi się nasuwa na myśl że może być błąd w bibliotece tej pierwszej. A dla tego że jak pisałem wcześniej jakąś bibliotekę dll, to wykorzystywałem biblioteki np. CURL I też było wykorzystywane linkowanie statyczne. A jakoś problemów z kompilacją nie było. Więc szczerze już nie wiem. A wspomniałeś że sposób linkowania nie ma znaczenia. |
|
pekfos |
» 2015-09-17 10:37:00 Tylko że wywala mi błąd że funkcja SUMA jest nie zdeklarowana w tym projekcie. |
Może by tak w tym kierunku..? Pokaż plik z deklaracją tej funkcji, jeśli uważasz, że ją masz. |
|
elradziu Temat założony przez niniejszego użytkownika |
» 2015-09-17 13:36:12 Deklaracja funkcji znajduje się w pliku main.h (podczas tworzenia bliblioteki test1.dll) main.h: #ifndef __MAIN_H__ #define __MAIN_H__
#include <windows.h>
#ifdef BUILD_DLL #define DLL_EXPORT __declspec(dllexport) #else #define DLL_EXPORT __declspec(dllimport) #endif
#ifdef __cplusplus extern "C" { #endif void DLL_EXPORT SomeFunction( const LPCSTR sometext ); int DLL_EXPORT Suma( int a, int b ); #ifdef __cplusplus } #endif
#endif
Gdy wykorzystuję tą bibliotekę test1.dll bezpośrednio w programie *exe. To problemów nie ma, linkuję statycznie całą bibliotekę przez: Dodanie do linkiera pliku libtest1.a dodanie po przez #include "main.h" (tak jak w pierwszym poście), ponad to plik main.h jest skopiowany do katalogu projektu test2. czyli mojej drugiej biblioteki dll. |
|
pekfos |
» 2015-09-17 14:23:09 Plik main2.h:
#ifndef __MAIN_H__ #define __MAIN_H__
|
Zmień na __MAIN2_H__. |
|
« 1 » 2 |