Solucionado (ver solução)
Solucionado
(ver solução)
1
resposta

undefined reference to __main collect2: error: ld returned 1 exit status

O programa em C, utilizando o makefile abaixo:

Nome do programa de sa¡da

TARGET = meu_programa

Compilador

CC = gcc

Op‡äes de compila‡Æo

CFLAGS = -Wall -Wextra -std=c99

Diret¢rios dos arquivos fonte e de sa¡da

SRCDIR = src OBJDIR = obj BINDIR = bin

Lista de arquivos fonte

SOURCES = $(wildcard $(SRCDIR)/*.c) OBJECTS = $(patsubst $(SRCDIR)/%.c,$(OBJDIR)/%.o,$(SOURCES))

Comando padrÆo para compilar o programa

all: $(BINDIR)/$(TARGET)

Compila‡Æo dos arquivos objeto

$(OBJDIR)/%.o: $(SRCDIR)/%.c @mkdir -p $(OBJDIR) $(CC) $(CFLAGS) -c $< -o $@

Linkagem para gerar o execut vel

$(BINDIR)/$(TARGET): $(OBJECTS) @mkdir -p $(BINDIR) $(CC) $(CFLAGS) $^ -o $@

Limpeza dos arquivos intermediários e do executável

clean: rm -rf $(OBJDIR) $(BINDIR)

#Regra para reconstruir o projeto rebuild: clean all

Define as regras que não correspondem a arquivos

.PHONY: all clean rebuild

No Windows, compila

No Windows, e roda perfeitamente: Insira aqui a descrição dessa imagem para ajudar na acessibilidade

porém Na VM Linux, o mesmo programa utiilizando o mesmo makefile apresenta a mensagem, conforme abaixo:

undefined reference to __main collect2: error: ld returned 1 exit status

1 resposta
solução!

Oi Alberto, tudo bem?

O problema que você está enfrentando pode estar relacionado ao fato de que no ambiente Linux, o ponto de entrada padrão para programas em C é a função main, enquanto no Windows, pode ser WinMain ou main dependendo do tipo de aplicação. O erro "undefined reference to __main" sugere que o linker não está encontrando a referência para a função main no seu código.

Vamos revisar o seu código e o makefile. O makefile parece estar bem estruturado, mas é sempre bom garantir que todas as dependências estejam sendo consideradas corretamente. Uma possível modificação que pode ajudar a resolver o problema é adicionar explicitamente o arquivo que contém a função main no comando de compilação e linkagem. Modifique a regra all no seu makefile da seguinte forma:

all: $(BINDIR)/$(TARGET)

$(BINDIR)/$(TARGET): $(OBJECTS) $(SRCDIR)/main.c
    @mkdir -p $(BINDIR)
    $(CC) $(CFLAGS) $^ -o $@

Dessa forma, estamos adicionando explicitamente o arquivo main.c como uma dependência do alvo $(TARGET). Isso garante que o linker inclua a função main durante a linkagem.

Além disso, certifique-se de que o arquivo main.c esteja presente no diretório src. Se o nome do arquivo for diferente, ajuste a regra de acordo.

Se o problema persistir, pode ser útil verificar se há alguma diferença significativa entre o ambiente Windows e a VM Linux que possa estar afetando a execução do seu programa. Isso pode incluir diferenças nas configurações do compilador ou bibliotecas disponíveis.

Outro ponto importante é garantir que as bibliotecas necessárias estejam instaladas na VM Linux. O uso de opções como -std=c99 pode introduzir dependências específicas. Certifique-se de que o ambiente Linux tem as bibliotecas necessárias instaladas.

Se, mesmo após essas modificações, o problema persistir, pode ser útil revisar o código-fonte para garantir que não haja problemas na definição da função main ou em outras partes críticas do código.

Espero que essas sugestões ajudem a resolver o problema.

Um abraço e bons estudos.