web-dev-qa-db-fra.com

Construire et utiliser une lib sans l’installer? (par exemple, libcurl)

J'aimerais utiliser libcurl (une librairie qui gère les connexions HTTP) en la liant de manière statique à un programme que j'écris. Je suis nouveau dans la construction de programmes à partir de leur source, donc je n’ai aucune idée de la façon de le faire (je voudrais éviter d’installer libcurl, de sorte que ne pas gâcher mon système).

Alors le voici. J'ai téléchargé libcurl sources , puis je les ai construits avec ./configure && make && make test. Eh bien, je pense que je les ai construits, parce que les tests réussissent. Et en fait, j'ai téléchargé le code source de l'intégralité du logiciel curl. Je suppose donc que j'ai construit plus que la simple bibliothèque libcurl.

Maintenant, j'écris mysource.c:

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

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

J'ai donc apporté tout le dossier include de la source curl près de mysource.c, afin que le préprocesseur résolve le #include <curl/curl.h>. Je suppose que je devrais aussi apporter la bibliothèque binaire construite (comme libcurl.o? libcurl.so? libcurl.a? Autre chose?). Mais je ne trouve aucun fichier avec de tels noms dans le dossier/sous-dossier curl. Où est-il situé?
Même si je le trouvais et le mettais avec mes propres sources, utiliser gcc -static -I... -L... -lcurl mysource.c fonctionnerait-il? Comment gcc pourrait-il alors comprendre le drapeau -lcurl?

Plus généralement (et la question suivante devrait fonctionner avec toutes les sources, pas seulement curl/libcurl), lors de la construction à partir d'une source, où vont les binaires compilés et liés? Je sais que je devrais avoir ma réponse en lisant la makefile, mais elle compte des milliers de lignes et je ne vois vraiment pas le répertoire de sortie des fichiers binaires construits.
Je sais que si je lance également make install, je devrais les trouver quelque part comme /usr/local/bin, /usr/local/lib (et les fichiers .h correspondants, le cas échéant, dans /usr/local/include). Mais que se passe-t-il si je ne souhaite pas installer le logiciel que je viens de construire? Puis-je simplement récupérer les fichiers compilés pour les utiliser?

Merci beaucoup

2
Daladim

L'idée est que le compilateur transforme le fichier .c en .o, appelé fichier objet. Ensuite, on utilise ar pour créer une bibliothèque, un fichier supposé contenir plusieurs fonctions C compilées, hm, qu’il est possible de réutiliser. Enfin, ld effectue une liaison en créant .so ou ELF à partir de fichiers .o et .a spécifiés. En raison de cette complexité inutile, la plupart des compilateurs sont également des interfaces client pour ld et ar bintools.

Pour remplacer le chemin où le compilateur/éditeur de liens recherche les bibliothèques, on utilise l'option --library-path = searchdir. Bien que je réponde simplement à la question, vous n’avez pas vraiment besoin d’un fichier .AE pour les ELF statiquement liés.

Alors, à quel module (fichier .o) vous devez vous connecter pour utiliser des fonctions particulières? Généralement, vous devriez rechercher le fichier .c, par défaut, le fichier xyz.c est compilé dans xyz.o, vous en aurez donc besoin.

1
Vladimir Kovalchuk