GBecker 51 Denunciar post Postado Julho 22, 2012 Boa tarde pessoal! Seguinte, faço parte na empresa onde trabalho de um projeto em que fiquei responsável por desenvolver uma Bilioteca Dinâmica para windows e Linux. Esta biblioteca já está pronta, mas pelo fato de ter sido feita na "correria", ficou extremamente desorganizada. Esta desorganização aumenta as chances de ocorrer bugs e dificulta a manutenção da mesma. Então decidi reestruturar a biblioteca inteira, desenvolvendo paralelamente no Windows e no Linux (a primeira versão é só para windows). Minha dúvida: - No windows: Quando criei a DLL. É criado uma função main propria do windows: BOOL WINAPI DllMain(HINSTANCE hinstDLL, DWORD fdwReason, LPVOID lpvReserved) Debugando o código, vi que a sequencia de execução passa por esta função tanto quando a DLL é carregada quanto ela é descarregada pelo programa usuário. Como utilizo um objeto que é o meu "controlador de recursos" da DLL, instâncio este objeto dentro desta função. beleza, esta parte funciona bacana. - No Linux: É aqui que esta minha dúvida, quando criei a shared object(SO), não foi criado uma função main. Criou apenas as funções que serão exportadas pela SO. A minha dúvida é esta, na biblioteca dinâmica do Linux. Há uma função que é chamada quando a biblioteca é carrega/descarregada pelo programa usuário(A função "main" da SO, como tem no Windows)?? Outras informações: - No ambiente windows: Utilizo Windows 7 e o code::blocks V10.05 para o desenvolvimento. - No ambiente Linux: Utilizo Ubuntu 12.04 e o Netbeans com plugin de C/C++ para o desenvolvimento. É isso aí,fico grato por qualquer ajuda e informação. Abraço! Alguém para me ajudar nesta dúvida?? Compartilhar este post Link para o post Compartilhar em outros sites
Renato Utsch 24 Denunciar post Postado Julho 29, 2012 Olá! Então, antes de tudo, eu gostaria só de comentar as experiências que eu tive em programar para windows e posix. Praticamente todos os programas que estive escrevendo até agora foram feitos focados nos dois, ou então somente para posix e usando o cygwin no windows. Mas então, eu percebi que é muito mais fácil você fazer um layer de abstração para trabalhar com a multiplataforma, ter uma parte mais "low-level" do código em que você separa o que é de cada SO e fazer uma interface uniforme para os dois SO's para trabalhar em cima. Se você pegar qualquer biblioteca maior ou algum framework, como o Qt, vai ver que é exatamente isso que eles fazem. Fica muito mais organizado e muito mais fácil de manter e desenvolver quando só tem código que varia de SO em um pequeno pedaço. Sério, ver aqueles códigos que têm #ifdef's e etc para cada SO em todos os arquivos, em várias funções, nossa, é muito feio e confuso... Quanto à shared library do linux, leia abaixo: http://tdistler.com/2007/10/05/implementing-dllmain-in-a-linux-shared-library O que acontece é que é muito problemática essa parte em que a DLL está sendo carregada, até no windows, se não estou enganado. Sério, é bem melhor você forçar quem está chamando a biblioteca a chamar uma função initialize() e no final uma destroy() do que usar esse tipo de função. Se você olhar, isso é o que todas as bibliotecas fazem, pegue por exemplo o cURL ou a nCurses, vai ver que é assim. Se você realmente prestar atenção também, isso é dependente do GCC. Ah, e só para desencargo de consciência, acho importante que leia isso: No, Linux .so shared object libraries don't have an equivalent to "Dllmain()". I would argue that's a good thing: *nix .so's are simply libraries - they're not trying to be executables, too. As you probably know, DllMain is usually just an empty stub (Microsoft discourages you from doing any more work than absolutely necessary in DllMain), so perhaps your best bet is to wrap your DllMain in an "#if defined(WIN32)". These links might help: http://www.woodtennis.com/win2unix.html http://en.wikipedia.org/wiki/Library_(computer_science) http://www.linuxquestions.org/questions/programming-9/dll-main-in-*-so-384794/ Mas se realmente precisa, está aí. Abraços :D Compartilhar este post Link para o post Compartilhar em outros sites
GBecker 51 Denunciar post Postado Julho 30, 2012 Eaí Renato! Vlw pela reposta e já estou lendo o material que me indicou. Desisti da ideia de utilizar o main da DLL/SO, vou utilizar uma função para inicializar o que for utilizado pela biblioteca, que deverá ser chamada pelo usuário da mesma. Quanto a abstração, criei uma classe de interface que contém as chamadas as funções da biblioteca. Utilizei ifdef's apenas nas funções que serão exportadas pela mesma desta forma: #ifdef _WIN32 DECLDIR int DLLG3_IniciaDriver(char *pcNomeCanal) { #endif //_WIN32 #ifdef __linux__ int SOG3_IniciaDriver(char *pcNomeCanal) { #endif //__linux } Vlw pela ajuda!! Compartilhar este post Link para o post Compartilhar em outros sites
Renato Utsch 24 Denunciar post Postado Julho 30, 2012 Olá! Eu pegaria no #ifdef a definição da POSIX, ao invés desse __linux__ que você tá usando, vai ajudar a portar para outros SO's. Mas bom que resolveu seu problema, eu acho bem interessante essa parte de portabilidade, qualquer coisa que eu puder ajudar, só falar ;) Abraços :D Compartilhar este post Link para o post Compartilhar em outros sites