2017-04-06 2 views
0

Ich versuche ein Makefile zu schreiben, das ein C-Projekt auf mehreren Plattformen kompiliert, zum Beispiel: CentOS, OS X, OpenSUSE. Ich stehe jedoch auf das Problem, dass Header-Dateien für externe Bibliotheken nicht immer an der gleichen Stelle sind. Ich denke, das liegt an Verpackungen, über die ich keine Kontrolle habe.Wie kann ich externe Header-Dateien, die sich in verschiedenen (unbekannten) Verzeichnissen befinden können, robust einbeziehen?

Zum Beispiel: Während einschließlich der BLAS lapacke.h der Erklärung auf meiner CentOS Installation erforderlich Include-Datei ist #include<lapacke.h>. Auf OpenSUSE ist der Weg #include<openblas/lapacke.h>

ich #include<lapacke.h> verwenden können, dann mit -I/usr/include/openblas kompilieren, und das funktioniert sowohl auf CentOS und OpenSUSE, aber ich erwarte nicht, dieser Pfad enthalten im Allgemeinen zu arbeiten, weil andere Systeme openblas in einem anderen setzen kann Lage. Wie konfiguriere ich dieses Projekt so, dass es auf den meisten Plattformen kompiliert wird, ohne dass Benutzer manuell mit dem Makefile arbeiten müssen?

+0

autotools wird dies für Sie tun – cleblanc

+0

Sie verwenden den offiziellen Namensstring, wenn Sie die '# include' Zeile schreiben - was die Dokumentation für das Projekt Ihnen sagt zu verwenden. Sie verwenden dann AutoTools ('autoconf',' automake', 'libtool' usw.) und/oder' pkg-config', um herauszufinden, wo die Software installiert ist - oder um dem Benutzer zu ermöglichen anzugeben, wo die Software installiert ist. Du machst es nicht direkt; dieser Weg führt zum Wahnsinn - besonders da es Nutzer gibt (z. B. mich), die darauf bestehen, Software in abgelegenen Orten auf ihrem Computer zu installieren (hauptsächlich, damit die Software nicht im Weg ist, wenn ich sie nicht will) benutzt werden). –

Antwort

2

Wie konfiguriere ich dieses Projekt, um auf den meisten Plattformen zu kompilieren, ohne dass Benutzer manuell mit dem Makefile basteln müssen?

Wie es für Bibliotheken im Allgemeinen gilt, ist dies ein klassisches und mehrjähriges Problem. Es ist Teil der raison d'être von Build-Konfigurationssysteme wie die Autotools und CMake, und der pkg-config-Dienstprogramm. Einige Pakete enthalten eigene Dienstprogramme zum Melden von Builddetails.

Keine von denen sind narrensicher. Wenn Sie nicht auf einer von ihnen können oder wollen nicht, dann sind Ihre anderen Optionen verlassen grundsätzlich

  • der Benutzer die benötigten Pfade machen liefern (entweder durch Bearbeiten einer Datei oder durch eine handgerollte Skript versehen mit die Software) oder
  • bieten eine Reihe von vorkonfigurierten Konfigurationen für bekannte Systemtypen, und entweder automatisch erkennen oder den Benutzer bitten, den Systemtyp anzugeben.

Ich habe alle oben genannten einzeln und in verschiedenen Kombinationen gesehen.

Verwandte Themen