Abrir um arquivo URL pelaLlinguagem C

1. Abrir um arquivo URL pelaLlinguagem C

Jorge Luiz Gouveia Sousa
JorgeLuizGS

(usa Ubuntu)

Enviado em 18/04/2026 - 18:01h

Olá!
O chatGPT cuspiu esse código na Linguagem C!
Estou usando o gcc do MSYS2 no Windows. Não está indentificando o pacote

#include <curl/curl.h>

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <curl/curl.h>

// Estrutura para armazenar a resposta
struct Memory {
char *data;
size_t size;
};

// Callback para capturar o corpo da resposta
size_t write_callback(void *contents, size_t size, size_t nmemb, void *userp) {
size_t total_size = size * nmemb;
struct Memory *mem = (struct Memory *)userp;

char *ptr = realloc(mem->data, mem->size + total_size + 1);
if(ptr == NULL) {
printf("Erro de memória\n");
return 0;
}

mem->data = ptr;
memcpy(&(mem->data[mem->size]), contents, total_size);
mem->size += total_size;
mem->data[mem->size] = '\0';

return total_size;
}

void rURLConnection(const char *url) {
CURL *curl;
CURLcode res;

struct Memory chunk;
chunk.data = malloc(1); // inicializa vazio
chunk.size = 0;

curl_global_init(CURL_GLOBAL_DEFAULT);
curl = curl_easy_init();

if(curl) {
curl_easy_setopt(curl, CURLOPT_URL, url);

// Header User-Agent
curl_easy_setopt(curl, CURLOPT_USERAGENT,
"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36");

// Callback para capturar resposta
curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, write_callback);
curl_easy_setopt(curl, CURLOPT_WRITEDATA, (void *)&chunk);

// Executa requisição
res = curl_easy_perform(curl);

if(res != CURLE_OK) {
fprintf(stderr, "Erro: %s\n", curl_easy_strerror(res));
} else {
long status;
curl_easy_getinfo(curl, CURLINFO_RESPONSE_CODE, &status);

printf("Status: %ld\n", status);
printf("%s\n", chunk.data);
}

curl_easy_cleanup(curl);
}

free(chunk.data);
curl_global_cleanup();
}

int main() {
rURLConnection("https://www.ouka.com.br/x-index.html");
return 0;
}


Abrir um arquivo URL pelo Java funciona normalmente, veja:
Mas quero que o código rode na Linguagem C

import java.net.http.HttpClient;
import java.net.http.HttpRequest;
import java.net.http.HttpResponse;
import java.net.URI;

public class JavaTeste {
public static void main(String[] args) {
try {
rURLConnection("https://www.ouka.com.br/x-index.html");
} catch (Exception error) {
System.out.println("A URL não Funcionou");
System.out.println(error.getMessage());
}
}

public static void rURLConnection(String VarURL) throws Exception {
HttpClient client = HttpClient.newHttpClient();
HttpRequest request = HttpRequest.newBuilder()
.uri(URI.create(VarURL))
.header("User-Agent", "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36")
.GET()
.build();

HttpResponse<String> response = client.send(request,
HttpResponse.BodyHandlers.ofString());

System.out.println("Status: " + response.statusCode());
System.out.println(response.body());
}
}



  


2. Re: Abrir um arquivo URL pelaLlinguagem C

Buckminster
Buckminster

(usa Void Linux)

Enviado em 19/04/2026 - 23:56h

Instale a biblioteca, provavelmente é isso:
pacman -S mingw-w64-ucrt-x86_64-curl
ou
pacman -S mingw-w64-x86_64-curl


_________________________________________________________
Rule number one: Always listen 'to' Buck!
Enquanto o cursor estiver pulsando, há vida!


3. Re: Abrir um arquivo URL pelaLlinguagem C

Jorge Luiz Gouveia Sousa
JorgeLuizGS

(usa Ubuntu)

Enviado em 20/04/2026 - 09:58h

Instalei os dois pacotes e deu o seguinte erro:

C:\xampp\htdocs\iataganCursos\Megusta\test>gcc testWeb.c -o testWeb.exe -lm
C:/msys64/ucrt64/bin/../lib/gcc/x86_64-w64-mingw32/15.2.0/../../../../x86_64-w64-mingw32/bin/ld.exe: C:\Users\JORGEL~1\AppData\Local\Temp\ccLeZ0zL.o:testWeb.c:(.text+0x20c): undefined reference to `__imp_curl_global_init'
C:/msys64/ucrt64/bin/../lib/gcc/x86_64-w64-mingw32/15.2.0/../../../../x86_64-w64-mingw32/bin/ld.exe: C:\Users\JORGEL~1\AppData\Local\Temp\ccLeZ0zL.o:testWeb.c:(.text+0x215): undefined reference to `__imp_curl_easy_init'
C:/msys64/ucrt64/bin/../lib/gcc/x86_64-w64-mingw32/15.2.0/../../../../x86_64-w64-mingw32/bin/ld.exe: C:\Users\JORGEL~1\AppData\Local\Temp\ccLeZ0zL.o:testWeb.c:(.text+0x240): undefined reference to `__imp_curl_easy_setopt'
C:/msys64/ucrt64/bin/../lib/gcc/x86_64-w64-mingw32/15.2.0/../../../../x86_64-w64-mingw32/bin/ld.exe: C:\Users\JORGEL~1\AppData\Local\Temp\ccLeZ0zL.o:testWeb.c:(.text+0x25f): undefined reference to `__imp_curl_easy_setopt'
C:/msys64/ucrt64/bin/../lib/gcc/x86_64-w64-mingw32/15.2.0/../../../../x86_64-w64-mingw32/bin/ld.exe: C:\Users\JORGEL~1\AppData\Local\Temp\ccLeZ0zL.o:testWeb.c:(.text+0x27e): undefined reference to `__imp_curl_easy_setopt'
C:/msys64/ucrt64/bin/../lib/gcc/x86_64-w64-mingw32/15.2.0/../../../../x86_64-w64-mingw32/bin/ld.exe: C:\Users\JORGEL~1\AppData\Local\Temp\ccLeZ0zL.o:testWeb.c:(.text+0x29a): undefined reference to `__imp_curl_easy_setopt'
C:/msys64/ucrt64/bin/../lib/gcc/x86_64-w64-mingw32/15.2.0/../../../../x86_64-w64-mingw32/bin/ld.exe: C:\Users\JORGEL~1\AppData\Local\Temp\ccLeZ0zL.o:testWeb.c:(.text+0x2aa): undefined reference to `__imp_curl_easy_perform'
C:/msys64/ucrt64/bin/../lib/gcc/x86_64-w64-mingw32/15.2.0/../../../../x86_64-w64-mingw32/bin/ld.exe: C:\Users\JORGEL~1\AppData\Local\Temp\ccLeZ0zL.o:testWeb.c:(.text+0x2c1): undefined reference to `__imp_curl_easy_strerror'
C:/msys64/ucrt64/bin/../lib/gcc/x86_64-w64-mingw32/15.2.0/../../../../x86_64-w64-mingw32/bin/ld.exe: C:\Users\JORGEL~1\AppData\Local\Temp\ccLeZ0zL.o:testWeb.c:(.text+0x305): undefined reference to `__imp_curl_easy_getinfo'
C:/msys64/ucrt64/bin/../lib/gcc/x86_64-w64-mingw32/15.2.0/../../../../x86_64-w64-mingw32/bin/ld.exe: C:\Users\JORGEL~1\AppData\Local\Temp\ccLeZ0zL.o:testWeb.c:(.text+0x332): undefined reference to `__imp_curl_easy_cleanup'
C:/msys64/ucrt64/bin/../lib/gcc/x86_64-w64-mingw32/15.2.0/../../../../x86_64-w64-mingw32/bin/ld.exe: C:\Users\JORGEL~1\AppData\Local\Temp\ccLeZ0zL.o:testWeb.c:(.text+0x347): undefined reference to `__imp_curl_global_cleanup'
collect2.exe: error: ld returned 1 exit status



4. Re: Abrir um arquivo URL pelaLlinguagem C

Jorge Luiz Gouveia Sousa
JorgeLuizGS

(usa Ubuntu)

Enviado em 22/04/2026 - 10:37h

Olá?
Alguém?


5. Re: Abrir um arquivo URL pelaLlinguagem C

Paulo
paulo1205

(usa Ubuntu)

Enviado em 25/04/2026 - 00:28h

Você colocou -lm para incluir a biblioteca de funções matemáticas, mas não colocou -lcurl (ou algo parecido — eu pessoalmente nunca usei) para incluir a biblioteca de funções do CURL.

Lembre-se de que a geração de um programa executável a partir de código em C ou C++ tem várias etapas. A primeira etapa, que a gente chama de compilação (e que pode ter sub-etapas, como o pré-processamento, que resolve o uso de macros e diretivas como #include), transforma o código fonte em código objeto, que tipicamente já tem alguns blocos em linguagem de máquina, mas que ainda não resolveu todos os mapeamentos de nomes de símbolos (tipicamente de variáveis globais e de funções) para endereços físicos. Essa resolução de endereços só acontece numa etapa posterior, chamada de “linking” (ou “ligação”, ou ainda “link-edição” por alguns de nós dinossauros).

Quando você diz no seu código fonte algo como “#include <curl/curl.h>”, você só está passando informações para o compilador saber quais símbolos existem e de quais tipos eles são (o sufixo “.h” é para abreviar headers, ou cabeçalhos, que é como o C designa declarações de símbolos que não estão acompanhadas de suas definições). Essas declarações permitem ao compilador verificar se você está usando os símbolos e tipos de dados de maneira sintaticamente correta, mas os objetos designados por esses símbolos não são sequer manipulados durante a compilação: o máximo que o compilador faz é deixar referências dos usos de tais símbolos para que o linker posteriormente resolva seus nomes nos respectivos endereços.

Para que o linker possa resolver os símbolos, você tem de indicar especificamente onde ele deve procurar.


O GCC é um compilador. Ele, em si, não faz a link-edição. Por conveniência, ele pode invocar o linker para você, mas, nesse caso, tirando a biblioteca de funções essenciais do sistema (a famosa libc), todas as outras bibliotecas de que você precisar para a etapa de link-edição têm de ser explicitamente indicadas (através de opções tais como “-lnome_biblioteca”, ou “-Ldiretório_onde_se_encontra -lnome_biblioteca”, ou ainda “-Wl,outra_opção_do_linker=argumento_dessa_opção”).


... Então Jesus afirmou de novo: “(...) eu vim para que tenham vida, e a tenham plenamente.” (João 10:7-10)


6. Re: Abrir um arquivo URL pelaLlinguagem C

Paulo
paulo1205

(usa Ubuntu)

Enviado em 25/04/2026 - 01:11h

Ah, e a ordem dos argumentos importa para o linker.

Para o linker, que implementa uma lógica de execução “simples”, você primeiro precisa especificar os arquivos com código objeto que fazem as chamadas, e depois os arquivos ou bibliotecas que implementam o que tiver sido chamado pelo que já tiver sido link-editado anteriormente.

Em alguns casos, pode até ser que a mesma biblioteca tenha de ser incluída mais de uma vez na mesma link-edição, se:

    • houver uma dependência cíclica entre funções de duas bibliotecas distintas (e.g. seu programa usa funções da LibA, que por sua vez usa funções da LibB, mas LibB usa uma função da LibA que foi chamada pelo seu programa, e portanto não foi considerada pelo linker no momento em que ele leu a LibA pela primeira vez, então você teria algo como “[b]gcc seu_programa.c -liba -libb -liba[b]” — por mais que esse tipo de interdependência cíclica não devesse ocorrer, o mundo real nem sempre é tão simples ou tão organizado quanto a teoria), ou

    • se duas bibliotecas dependerem de funções diferentes de uma terceira biblioteca, de modo que a primeira passagem só resolve os símbolos usados por uma delas, e uma nova passagem tenha de ser feita para resolver os símbolos da outra (e.g. se LibX implementa funções usadas pela LibY e pela LibZ, mas o conjunto de funções usadas pela LibY é diferente daquele usado pela LibZ, pode ser necessário usar algo como “[b]gcc seu_programa.c -liby -libx -libz -libx[b]”).


... Então Jesus afirmou de novo: “(...) eu vim para que tenham vida, e a tenham plenamente.” (João 10:7-10)






Patrocínio

Site hospedado pelo provedor RedeHost.
Linux banner

Destaques

Artigos

Dicas

Tópicos

Top 10 do mês

Scripts