Erro ao compilar qualquer programa sem Main

Iniciado por hulkPT, 09 de Dezembro de 2009, 13:04

tópico anterior - próximo tópico

hulkPT

Boa tarde a todos,
tou com um problema que me está a inquietar bastante, desde ontem que nao consigo compilar programa nenhum que nao tenha main
Como por exemplo


#include<stdio.h>
#include<string.h>

/*exemplo.c*/

void exemplo(){
         printf("\n Exemplo");
}
void exemplo2(){
         printf("\n Exemplo");
}
void exemplo3(){
         printf("\n Exemplo");
}


compilo: gcc exemplo.c -o exemplo
corro: ./exemplo

da o seguinte erro:

/usr/lib/gcc/i486-linux-gnu/4.4.1/../../../../lib/crt1.o: In function `_start':
/build/buildd/eglibc-2.10.1/csu/../sysdeps/i386/elf/start.S:115: undefined reference to `main'
collect2: ld returned 1 exit status


nunca vi coisa igual nao sei o que fazer ainda ontem tudo funcionava lindamente

desde ja obrigado

hulkPT

NPC

Ô moço, mas como você quer executar um programa sem main? Quem vai chamar aquelas funções?
A pergunta principal é: você conseguia fazer isso antes?
Googling since 1999.

sboorbou

ja tinha olhado o topico antes e me feito a mesma pergunta... como vc fazia antes, mas como achei que não ia ajudar o topico me calei.......
duvida eu em você sinto... duvida a raiva leva, raiva ao ódio leva, ódio é o lado negro da força - Mestre Yoda

Darcamo

Você não pode criar um executável sem a main.
Quando você faz
gcc exemplo.c -o exemplo
o gcc faz duas coisas. Primeiro ele compila para um arquivo objeto e depois ele linka o que foi especificado para então gerar o arquivo executável. Você precisa ter implementado a função main para poder gerar um executável. Vai executar o que quando rodar o programa se não tiver a main?

Mas você pode compilar um arquivo objeto (um arquivo .o) sem ter implementado a função main e então linkar esse arquivo objeto com um outro programa que tenha uma função main para então criar um arquivo executável. Exatamente o que você quer fazer?

hulkPT

Peço desculpa mas tava completamente desorientado... No inicio tinha uma main() no programa e depois queria usar as funçoes noutro programa entao apaguei a main por isso é q nao dava... tou a fazer um programa com pipes e porta série tava me a dar a volta a cabeça so depois é que me aprecebi do que tava a fazer! Foi uma duvida/pergunta mesmo sem nexo eu ja estava a pensar em formatar o meu PC pensando que ele tava embruchado...
Obrigado a todos na mesma para a proxima vou pensar bem calmente antes de postar!

ricardofantin

Existem diversas situações que o programa deve ser compilado sem o main():

Quando deseja-se usar código nativo apartir do java (JNI) é necessário implementar uma função em C/C++. Esse código é compilado com o gcc/g++ mesmo sem o main() e chamado de dentro do java. Para o compilador não reclamar a falta do main() é só passar como argumento -shared . (gcc -shared codigo.c)

Outra situação é quanto compila-se muitos arquivos separadamente e depois junta tudo. O make em geral faz isso. Vamos supor que você esteja fazendo um programa com quatro classes. Para compilar cada classe separadamente e depois junta-las você deve fazer assim:
g++ -c classe1.cpp -o classe1.o
g++ -c classe2.cpp -o classe2.o
g++ -c classe3.cpp -o classe3.o
g++ -c classe4.cpp -o classe4.o
g++ classe1.o classe2.o classe3.o classe4.o -o executavel
pesquise sobre o make se quiser saber mais de como e principalmente do porquê fazer isso.

Darcamo

A main é necessária apenas quando você quer criar um executável.

Quando você passa a opção -shared você está criando uma biblioteca e não um executável. Nesse caso é exatamente o contrário: você não quer a função main.
Essa biblioteca pode então ser linkada com outros arquivos objeto para criar um executável e até mesmo chamada a partir de outras linguagens como você mencionou com o java. Quando se implementa módulos para o python em C também é a "mesma coisa". Você cria uma biblioteca que pode ser carregada pelo python.