Construindo e usando uma lib sem instalá-lo? (por exemplo, libcurl)

2

Eu gostaria de usar o libcurl (uma lib que lida com conexões HTTP) vinculando-o estaticamente a um programa que estou escrevendo. Eu sou novo em construir programas a partir de sua fonte, então eu não tenho idéia de como fazê-lo (eu gostaria de evitar instalar libcurl, para não mexer com o meu sistema).

Então aqui está. Eu baixei as fontes da libcurl e as construí com ./configure && make && make test . Bem, eu acho que os construí, porque os testes passam. E eu realmente baixei a fonte para o software curl inteiro, então eu acho que eu construí mais do que a biblioteca mera libcurl.

Agora, estou escrevendo mysource.c :

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

int main(void) {
  CURL *curl;
  curl = curl_easy_init();
  if(curl) {
    // do something
  }
  return 0;
}

Então, eu trouxe toda a pasta include da fonte de curl perto de mysource.c , para que o pré-processador resolva o #include <curl/curl.h> . Eu suponho que eu também deveria trazer o binário, construído lib (como libcurl.o ? libcurl.so ? libcurl.a ? Alguma outra coisa?). Mas não consigo encontrar nenhum arquivo com esses nomes na pasta / subpasta curl. Onde está localizado?
Mesmo se eu encontrá-lo e trazê-lo ao longo de minhas próprias fontes, usaria gcc -static -I... -L... -lcurl mysource.c work? Como o gcc seria capaz de entender o sinalizador -lcurl?

Mais genericamente (e a pergunta a seguir deve funcionar com todas as fontes, não apenas com curl / libcurl), ao compilar de uma fonte, para onde vão os binários compilados e vinculados? Eu sei que deveria ter minha resposta lendo makefile , mas são milhares de linhas, e eu realmente não vejo o diretório de saída para os binários compilados em nenhum lugar.
Eu sei que, se eu executar make install , devo encontrá-los em algum lugar como /usr/local/bin , /usr/local/lib (e os arquivos .h correspondentes, se houver, em /usr/local/include ). Mas o que acontece se eu não quiser instalar o software que acabei de criar? Não posso simplesmente pegar os arquivos compilados para usá-los?

Muito obrigado

    
por Daladim 23.12.2014 / 21:48

1 resposta

1

A ideia é que o compilador transforme o arquivo .c em .o, o chamado arquivo objeto. O próximo usa ar para criar uma biblioteca, um arquivo que deve conter várias funções C compiladas, que podem ser reutilizadas. Finalmente, ld realiza a vinculação, criando .so ou ELF a partir de arquivos .o e .a especificados. Devido a essa complexidade desnecessária, a maioria dos compiladores também são front-ends para ld e ar bintools.

Para substituir o caminho onde o compilador / vinculador procura por bibliotecas, usa-se a opção --library-path = searchdir. Embora eu esteja apenas respondendo a pergunta, você não precisa de um arquivo realmente para ELF vinculado estaticamente.

Então, qual módulo (arquivo .o) você precisa vincular para usar funções específicas? Geralmente você deve procurar o arquivo .c, por padrão o arquivo xyz.c é compilado em xyz.o, então você precisará disto.

    
por Vladimir Kovalchuk 23.12.2014 / 22:29