Visualizzazione dei risultati da 1 a 4 su 4
  1. #1
    Utente di HTML.it
    Registrato dal
    Jun 2003
    Messaggi
    4,826

    [c++]creare dll non in stile microsoft(senza __declspec(dllexport))

    ciao.
    Ho ripensato alla creazione delle dll e vorrei anche su consiglio di shodan creare delle dll che siano semplice codice compilato e che funzionino indipendentemente dalla versione del compilatore , senza la necessità di ricompilarle.
    Inoltre vorrei se possibile che queste dll siano utilizzabili in linux (anche ricompilando su piattaforma linux) per fare si che il mio progetto con pochi accorgimenti sia utilizzabile sotto ubuntu.
    ci sono articoli o documentazione per fare questo?.

    grazie.

  2. #2
    Stai mischiando tre cose diverse.

    In primis, non esiste un modo "standard" per creare dll - per il semplice fatto che lo standard C++ neanche menziona le dll. __declspec(dllexport) è il modo più semplice per esportare classi e quant'altro usando VC++, l'alternativa è passare al linker un file .def, il che può essere utile per esportare giusto funzioni "in stile C" con nomi non decorati.

    E qui veniamo alla questione del codice indipendente dal compilatore; dato che il C++ di suo non ha un ABI stabile (almeno, non su Windows con VC++), ci sono sostanzialmente due modi per ottenere l'effetto che chiedi: usare COM (complicato) o esportare solo funzioni in stile C, non passando mai oggetti C++ oltre il confine della dll, ma sempre handle/puntatori di qualche genere (può essere un'idea usare l'idioma PIMPL).

    Sulla questione Linux: ovviamente dovrai ricompilare (a meno di non voler usare Wine); per il resto, se non ricordo male di default quando crei una shared dynamic library con gcc su Linux tutti i simboli sono esportati di default, per cui non devi fare nulla di particolare. Su Linux la ABI di g++ mi pare sia ormai abbastanza fissata (usano la ABI C++ Itanium "adattata" a piattaforme x86), così come la ABI di libstdc++, per cui non dovrebbero esserci eccessivi problemi di compatibilità binaria in avanti, anche se è buona norma, se devi distribuire dei binari, compilarli con la minima versione di gcc e libstdc++ compatibile con le versioni attuali (tipicamente si compila sull'ultima Debian Stable o su una Fedora stabile); è sempre possibile comunque fare linking statico, ma a quel punto fai prima a linkare anche l'eseguibile insieme e fare un mega-eseguibile tutto in uno.
    Amaro C++, il gusto pieno dell'undefined behavior.

  3. #3
    In buona sostanza puoi usare le direttive di compilazione condizionale.
    Qualcosa del genere:

    lib1.h:
    codice:
    #ifndef MY_LIB1_H
    #define MY_LIB1_H
    
    #if defined _WIN32 || defined __CYGWIN__
    	#ifdef MYDLL_EXPORTS
    		#define MYDLL_API __declspec(dllexport)
    	#else
    		#define MYDLL_API __declspec(dllimport)
    	#endif
    #else
    	#if __GNUC__ >= 4
    		#define MYDLL_API __attribute__ ((visibility ("default")))
    	#else
    		#define MYDLL_API 
    	#endif
    #endif
    
    #ifdef __cplusplus
    extern "C" {
    #endif
    
    MYDLL_API int somma(int x, int y);
     
    #ifdef __cplusplus
    }
    #endif
    
    #endif /* MY_LIB1_H */
    Quello sopra è l'header file di una libreria(dinamyc linking library, .dll, su windows; shared library, .so, su Linux) che esporta la funzione somma.

    lib1.c:
    codice:
    #include <stdio.h>
    #include <stdlib.h>
    
    #define MYDLL_EXPORTS
    #include "lib1.h"
    
    MYDLL_API int somma(int x, int y)
    {
    	return x + y;
    }

  4. #4
    Utente di HTML.it
    Registrato dal
    Jun 2003
    Messaggi
    4,826
    o esportare solo funzioni in stile C, non passando mai oggetti C++ oltre il confine della dll, ma sempre handle/puntatori di qualche genere (può essere un'idea usare l'idioma PIMPL).
    scusa se sparo una cavolata, ma posso passare il puntatore ad una factory che mi genera delle classi e ne passa il puntatore?
    cosi avrei il puntatore alle classi ma non le dichiarerei.
    ribadisco , è un idea.

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2024 vBulletin Solutions, Inc. All rights reserved.