[Resolvido] Compilar DLL escrita em C++

Caros, tenho usado o Visual C++ para compilar algumas DLL’s escritas em C++. Tá tudo funcionando direitinho, mas eu gostaria de saber qual comando eu usaria no prompt do DOS para compilar minha DLL. Acontece que eu não gosto da ideia de ficar preso à IDE. Quem puder me ajudar desde já agradeço.

Você pode criar seu próprio makefile(adicionar as dependências) e compilar usando o mingw.

Pois é lucas_carvalho100, mas eu gostaria de saber qual comando de compilação usar. Tipo um

Bom dia,

Para você utilizar o compilador por linha de comando, no caso do Visual C++ será o comando “cl” para compilar os arqvuios “.cpp”, e o comando “link” para linkar os objetos, e gerar sua dll.
Porém antes de utilizá-los, você deverá executar um arquivo “bat”, que encontra-se no mesmo diretório onde está o “cl.exe” (não tenho certeza do arquivo, mas acho que é “vcvars.bat”). Este arquivo bat é responsável por setar todas as variáveis de ambiente de “includes” “libs”, etc.

Mas você também pode utilizar compiladores free, como por exemplo o “g++”, instalando o “MinGW” ou “Cygwin”. Em ambos os casos, o próprio comando “g++” é utilizado para compilar e linkar.

Espero ter ajudado…

Assiste e ve se te ajuda…
http://www.youtube.com/watch?v=pRygZekosw0

Sobre os parâmetros:

Se for o “link”, do Visual C++, você utilizará “link /dll …”.

Se for o “g++”, você utilizará “g++ -shared …”.

Cara não tem o que eu queria. Isso é só o básico. Nao basta usar:

Não funciona. Me disseram que é um comando bem grande para compilar um arquivo .cpp para gerar uma dll. Mas eu não sei qual é esse comando.

Opa mrsuzuki, não tinha visto seu post. Vou testar agora

mrsuzuki, o comando que você me passou para o MingW não funcionou. Eu fiz:

É assim mesmo?

Você não tem que gerar o .O primeiro? Gera ele e depois você compila para dll…

Eu fiz desse jeito e também não funcionou.
Meu procedimento:
-> Criei um arquivo .h que define a função que irei exportar para a dll;
-> Depois eu criei um arquivo .cpp que implementa a referida funçãod
-> Eu compilei isso no Visual Studio e gerou uma DLL
-> Criei depois um arquivo .cpp que faz chamada a função da DLL

Então compilo o .cpp que define a dll usando a seguinte chamada:

Aparece o seguinte erro:

meus Arquivos:
Arquivo add.h (Arquivo de cabeçalho da dll):

Arquivo add.cpp (Arquivo com a implementação da DLL):

#include "add.h" int add(int x, int y) { return x + y; }

Arquivo que chama a minha DLL (main.cpp):

[code]#include"stdafx.h"
#include

extern “C” __declspec(dllimport) int add (int x, int y);

int main()
{
int a = 15;
int b = 14;
int resultado = add(a, b);
std::cout << “15 + 14” << resultado << std::endl;
return 0;
}[/code]

O erro aparece quando compilo o arquivo main.cpp.
Então, alguém poderia me ajudar?

Crie um arquivo makefile e coloque as dependências, pelo erro parece que ele não esta encontrando as dependências. As ligações que você faz no VS ou na IDE que você esta usando, tenq ser feitas no arquivo makefile.

matheuslmota, fiz um exemplinho aqui.
Para gerar a dll, teremos dois arquivos add.h e add.cpp

O add.h terá:

#ifndef _MYDLL_H_
#define _MYDLL_H_

#include <stdio.h>

extern "C" __declspec(dllexport) int add(int x, int y);

#endif[/code]

e o add.cpp terá:
[code]#include "add.h"

extern "C" __declspec(dllexport) int add(int x, int y) {
	return x + y;
}[/code]

Para gerar a dll utilizei o comando abaixo para compilar:
[quote]g++ -c -I "c:/cygwin/usr/include" -I "c:/cygwin/usr/include/win32" -o add.o add.cpp[/quote]

Isso vai gerar o objeto, e depois para linkar e gerar a dll:
[quote]g++ -shared -o teste.dll add.o[/quote]

O programa principal ficou assim:
[code]
#include <iostream>
#include <windows.h>

typedef int (*LPFUNC) (int x, int y);

int main() {

	HINSTANCE dll = LoadLibrary("teste.dll");
	
	if (!dll) { 
		std::cout << "error"; 
		return 0; 
	}
	
	LPFUNC add = (LPFUNC) GetProcAddress((HMODULE)dll, "add");
	
	int a = 15;  
	int b = 14;  

	int resultado = add(a, b);  
	
	std::cout << "15 + 14 = " << resultado << std::endl;  
	
	FreeLibrary((HMODULE)dll);
	
	return 0;  	

}
[/code]

e para gerar o executável, utilizei o comando: 
[quote]g++ -o main.exe main.cpp[/quote]

Na verdade eu coloquei tudo dentro de um Makefile, se você estiver familiarizado com ele, segue abaixo:

[code]LINK = g++
COMPILE = g++
INCLUDES = -I "c:/cygwin/usr/include" \
		   -I "c:/cygwin/usr/include/win32"
LIBPATH = -L "C:/cygwin/lib"
LIB = 
OBJECTS = add.o

all: ${OBJECTS}
	${LINK} -shared -o teste.dll add.o
	${LINK} -o main.exe main.cpp
	
add.o: add.cpp add.h
	$(COMPILE) -c ${INCLUDES} -o add.o add.cpp
	
clean:
	rm *.o
	rm *.exe
	rm *.dll
	 

Eu vi que em seu código você utilizou o seguinte:

Se eu não me engano (faz tempo que eu programei em Visual C++) isto é dependência do próprio Visual C++. Para migrar o seu projeto em Visual C++ para g++, por exemplo, você terá que modificar as dependências.
Veja que no Makefile eu “informo” onde estão as pastas de INCLUDE, e se fosse necessário, as de “LIB” também.

Até mais,

mrsuzuki, YOU ARE A GENIUS
Muito obrigado, funcionou perfeitamente. Obrigado também, lucas_carvalho100. No manual do MingW tem esses comandos? Eu os procurei mas não os encontrei.

[quote=matheuslmota]mrsuzuki, YOU ARE A GENIUS
Muito obrigado, funcionou perfeitamente. Obrigado também, lucas_carvalho100. No manual do MingW tem esses comandos? Eu os procurei mas não os encontrei.[/quote]

Dá uma olhada nesse artigo:

http://www.adp-gmbh.ch/win/misc/mingw/dll.html

juliocbq, interessante o artigo. No seguinte comando:

Qual a função do -Wall? Sei que o -shared é a flg para chamar o linker, mas e o -Wall? O que ele faz?