Existem vários tipos de arquivos de código binários/objetos/executáveis. Não tenho certeza de quão padrão esses nomes são, mas CS 11: Compilando programas C (na Caltech) refere-se a “arquivos de objeto” e “executáveis binários”. Uma explicação simples (talvez simplificada demais) é que um arquivo objeto contém as instruções produzidas pela compilação de um único arquivo fonte, enquanto um executável binário representa um programa completo. (Uma vez que você ultrapasse o nível de programação "Hello world", é comum ter vários arquivos de código-fonte para criar um único programa.) Arquivos de objeto são, mais ou menos por definição, programas incompletos e, portanto, não são executáveis .
Ao compilar com -c, você está criando um arquivo objeto, que contém sua mainfunção e nada mais. Ele contém a chamada para printf, mas não contém a printffunção em si ou os meios de localizá-la/carregá-la. Você deve deixar de fora a -copção, para obter um executável binário do programa completo.
Existem vários tipos de arquivos de código binários/objetos/executáveis. Não tenho certeza de quão padrão esses nomes são, mas CS 11: Compilando programas C (na Caltech) refere-se a “arquivos de objeto” e “executáveis binários”. Uma explicação simples (talvez simplificada demais) é que um arquivo objeto contém as instruções produzidas pela compilação de um único arquivo fonte, enquanto um executável binário representa um programa completo. (Uma vez que você ultrapasse o nível de programação "Hello world", é comum ter vários arquivos de código-fonte para criar um único programa.) Arquivos de objeto são, mais ou menos por definição, programas incompletos e, portanto, não são executáveis .
Ao compilar com
-c
, você está criando um arquivo objeto, que contém suamain
função e nada mais. Ele contém a chamada paraprintf
, mas não contém aprintf
função em si ou os meios de localizá-la/carregá-la. Você deve deixar de fora a-c
opção, para obter um executável binário do programa completo.