|
|
|
![]() |
|
Strumenti |
![]() |
#1 |
Senior Member
Iscritto dal: Nov 2000
Città: MILANO
Messaggi: 2658
|
Visual c++ 6.0 e utilizzo dll
sto usando per la prima volta questo vecchio compilatore. Volevo sapere come faccio a fargli linkare le librerie dinamiche anczichè quelle statiche. ho visto nelle proprietà del progetto che linka tutte le .lib. io vorrei che linkasse le dll. devo cambiare anche il codice?
in particolare volevo fargli linkare le opengl le glu e le glaux dinamiche. grazie ![]() |
![]() |
![]() |
![]() |
#2 |
Senior Member
Iscritto dal: Nov 2000
Città: MILANO
Messaggi: 2658
|
![]() |
![]() |
![]() |
![]() |
#3 | ||||
Bannato
Iscritto dal: Feb 2005
Città: Roma
Messaggi: 7027
|
Quote:
![]() Quote:
![]() forse mi sbaglio: dimmi come fai... Quote:
Quote:
1) tra i files del progetto aggiungi il file opengl32.lib che trovi non ricordo dove esattamente nelle directories dove è installato il compilatore (penso qualcosa tipo "C:\Program Files\Microsoft Visual Studio\VC98\Lib") 2) nel codice, nell'header dove includi "gl.h", scrivi: Codice:
#pragma comment(lib, "opengl32.lib") ![]() |
||||
![]() |
![]() |
![]() |
#4 | |||||
Senior Member
Iscritto dal: Nov 2000
Città: MILANO
Messaggi: 2658
|
innanzi tutto grazie mille per la pazienza.
premessa: ho ben presente come si linkano e utilizzano librerie dinamiche e statiche sotto linux. trovo molto più difficile capirlo sotto windows. ![]() Quote:
Quote:
![]() Quote:
Quote:
Quote:
Questa mi interessa tantissimo perchè le direttive pragma non le conosco. Beh ti ringrazio. Attendo tue delucidazioni - ho visto che c'è anche un documento nell'help "Dll's for beginners" ma non l'ho ancora letto attentamente. Se hai tempo e vuoi rispondermi ancora più avanti avrei bisogno anche di costruire una mia dll - per adesso sto programmando con un file principale in cui c'è anche l'eseguibile, poi devo togliere la parte col main e farlo diventare una libreria che peraltro dovrò chiamare da mathlab ![]() ![]() Ultima modifica di Black imp : 02-03-2006 alle 01:58. |
|||||
![]() |
![]() |
![]() |
#5 | |||||||
Bannato
Iscritto dal: Feb 2005
Città: Roma
Messaggi: 7027
|
Quote:
![]() Quote:
Quote:
![]() Quote:
Quote:
Quote:
per creare un file lib partendo dalla DLL il modo teorico esiste, ma un programma per farlo che io sappia ancora non esiste; prima degli esami (cioè a inizio gennaio) avevo iniziato a farne uno io stesso dato che penso che sarebbe una cosa utile, ma poi non l'ho continuato appunto a causa degli esami. Quote:
![]() possibilmente per chiarezza scrivila nello stesso file dove hai messo Codice:
#include <gl/gl.h> le direttive #pragma per definizione sono semplicemente delle direttive che vengono ignorate nel caso il compilatore non riesca a riconoscerle, quindi servono solo ad inserire nel codice direttive specifiche per il compilatore in uso; #pragma comment è specifica dei compilatori Microsoft-compatibili e serve appunto a linkarsi ad un lib che descrive una qualche DLL. |
|||||||
![]() |
![]() |
![]() |
#6 | |
Senior Member
Iscritto dal: Oct 2005
Messaggi: 3306
|
Quote:
Ciao! |
|
![]() |
![]() |
![]() |
#7 | ||
Bannato
Iscritto dal: Feb 2005
Città: Roma
Messaggi: 7027
|
Quote:
Quote:
![]() |
||
![]() |
![]() |
![]() |
#8 | ||
Senior Member
Iscritto dal: Oct 2005
Messaggi: 3306
|
Quote:
Ormai è qualche anno che non uso più il VC6 come compilatore, comunque ricordo che c'è addirittura un pezzo di codice del libro di Stroustrup che non viene compilato e con una ricerca con google è possibile trovare tanti esempi di classi template che non compilano con VC6. Tra questi vi è anche la libreria MySQL++, che compila solo sotto .NET2003 o superiori. Quote:
Ciao! |
||
![]() |
![]() |
![]() |
#9 |
Senior Member
Iscritto dal: Nov 2000
Città: MILANO
Messaggi: 2658
|
71104
Non ho capito una cosa: 1. se guardi l'immagine che ho linkato ho messo i tre file relativi a opengl col nome corretto, anche se nel descriverti la situazione ho dato dei nomi approssimativi - parlo di opengl32.lib, glu32.lib glaux.lib -. quello che non capisco adesso è questo: io vorrei usare le opengl 1.4 che sono date dalle 1.1 più le estensioni che vengono poi realizzate mi sembra specificamente dai produttori di schede video: come sfrutto tutte le estensioni di nvidia alle opengl1.1 se le opengl32.dll sono generiche e vecchie? o meglio, è vecchio il file opengl32.lib che contiene i simboli invocabili. 2. se voglio sostruirmi io una dll come si fa? e come faccio una lib per la mia dll? Tommino: morale che compilatore ide posso usare per scrivere in c e c++ - soprattutto c++ - per windows xp? - non mi interessa la piattaforma .net - grazie a tutti |
![]() |
![]() |
![]() |
#10 | |||
Bannato
Iscritto dal: Feb 2005
Città: Roma
Messaggi: 7027
|
Quote:
Quote:
1) un flag che si trova negli headers del file e che viene settato dal linker 2) l'entry point degli exe è progettato per essere eseguito dall'inizio alla fine; quello delle DLL invece è solo un handler per ricevere alcune notifiche e ha il seguente prototipo: Codice:
BOOL CALLBACK DllMain(HINSTANCE hinstDLL, DWORD fdwReason, PVOID pvReserved); per creare una DLL in Visual C++ 6 fai File -> New e poi scegli "Win32 Dynamic-Link Library" (oppure scegli "MFC AppWizard (dll)" se vuoi fare una DLL basata su MFC). in questo modo verrà creato un progetto le cui impostazioni contengono un'opzione che dice al linker che quell'immagine deve essere compilata come DLL, cioè che va settato quel flag che ti dicevo negli headers del file generato. il lib viene generato automaticamente secondo le impostazioni di default del compilatore; se vuoi puoi anche scegliere di non generarlo deselezionando una certa opzione che adesso non ricordo. per esportare un simbolo dichiaralo con __declspec(dllexport); per esempio: Codice:
__declspec(dllexport) int Foo(int bar); ![]() però se fai così devi fare partiolare attenzione al __declspec: devi definire una macro e fare in modo che questa macro sia definita come __declspec(dllexport) se l'header viene incluso in un file da compilare nella DLL, e __declspec(dllimport) se viene incluso in un file da compilare in un EXE che la usa. mi spiego meglio con un esempio, mettiamo che tu hai un file a.cpp che fa parte del progetto della DLL, e un file b.cpp che fa parte del progetto di un EXE che la usa; inoltre hai un header c.h che contiene i simboli esportati dalla DLL e importati dall'EXE; ecco il contenuto dei tre files: a.cpp Codice:
#define UNA_MACRO_CHE_TI_PARE #include "**percorso dell'header**/c.h" int Foo(int bar) { return bar; } Codice:
#include "**percorso dell'header**/c.h" int main() { return Foo(0); } Codice:
#ifndef __C_H__ #define __C_H__ #ifdef UNA_MACRO_CHE_TI_PARE #define #MYDECLSPEC __declspec(dllexport) #else #define #MYDECLSPEC __declspec(dllimport) #endif MYDECLSPEC int Foo(int bar); #endif Quote:
![]() |
|||
![]() |
![]() |
![]() |
#11 | |||||
Bannato
Iscritto dal: Feb 2005
Città: Roma
Messaggi: 7027
|
Quote:
![]() Quote:
![]() me lo scrivi tu sto pezzo di codice che non compila? ![]() io su Google trovo solo pezzi che compilano... ![]() Quote:
![]() mica li rifanno da zero eh, sempre del compilatore Microsoft si tratta... e Visual C++ non è l'unico programma che lo usa: c'è anche il DDK. Quote:
![]() ![]() ![]() e sei ancora vivo??? ![]() Quote:
|
|||||
![]() |
![]() |
![]() |
#12 | |
Senior Member
Iscritto dal: Oct 2005
Messaggi: 3306
|
Quote:
Il fatto che sia parte del framework .NET non ti obbliga ad usare .NET, rimane pur sempre un compilatore C++. Ciao! Ultima modifica di tomminno : 04-03-2006 alle 14:58. |
|
![]() |
![]() |
![]() |
#13 | |||||
Senior Member
Iscritto dal: Oct 2005
Messaggi: 3306
|
Quote:
Quote:
Ho abbandonato quel compilatore da anni, quindi non saprei dirti con esattezza un codice scritto da me che non compila con VC6, forse se ricompilassi tutto quello che ho fatto in questi anni qualcosa verrebbe fuori. Quote:
Quote:
Quote:
|
|||||
![]() |
![]() |
![]() |
#14 | |||||
Bannato
Iscritto dal: Feb 2005
Città: Roma
Messaggi: 7027
|
Quote:
Quote:
mi puoi pastare il codice del libro di Stroustrup che sono curioso? Quote:
Quote:
![]() Quote:
![]() ![]() vabbè, è a causa del fatto che è un linguaggio interpretato: se VB fosse dotato di un vero debugger i programmi potrebbero essere compilati prima dell'esecuzione e poi eseguiti stand-alone, come in ogni IDE fatto come Dio comanda. però magari in fondo c'è anche una questione di tradizione: BASIC da sempre è interpretato... (però in effetti potevano anche impegnarsi un attimino con un minimo di multithreading... ![]() Ultima modifica di 71104 : 04-03-2006 alle 21:49. |
|||||
![]() |
![]() |
![]() |
#15 | |||||
Senior Member
Iscritto dal: Oct 2005
Messaggi: 3306
|
Quote:
Se è un progetto console application non è un progetto vuoto. Quote:
![]() Superficialità a non finire, hai scaricato la libreria e non hai nemmeno letto di cosa si tratta eh! mysql.h è fornito insieme a MySQL. Dovresti sapere che se il compilatore trova un errore del genere non continua nella compilazione del codice. Quote:
http://www.medini.org/software/msviscxx/msviscxx.html Vi trovi anche il codice preso dal libro di Stroustup. Quote:
Comunque: http://tangentsoft.net/mysql++/ Quote:
|
|||||
![]() |
![]() |
![]() |
#16 | ||||||||
Bannato
Iscritto dal: Feb 2005
Città: Roma
Messaggi: 7027
|
Quote:
![]() Quote:
![]() allora: io voglio installare questa libreria; l'ho scaricata; l'ho decompressa; che faccio? Quote:
Quote:
Quote:
![]() ![]() Quote:
Quote:
Quote:
|
||||||||
![]() |
![]() |
![]() |
Strumenti | |
|
|
Tutti gli orari sono GMT +1. Ora sono le: 16:30.