Erstellen eines statischen Mac OS XC-Builds

Lesezeit: 5 Minuten

Daniels Benutzeravatar
Daniel

Wie kann ich unter Mac OS X einen statischen Build einer .c-Datei erstellen? Wenn ich versuche:

gcc -o test Main.c -static

Ich bekomme:

ld: library not found for -lcrt0.o
collect2: ld returned 1 exit status

  • mögliches Duplikat von How to static link on OS X

    – osgx

    10. März 2011 um 12:09 Uhr

Benutzeravatar von osgx
osgx

Es wird in gcc von Mac OS X nicht unterstützt:

http://discussions.apple.com/message.jspa?messageID=11053384

Vielleicht funktioniert dieses “-static”-Flag auf MacOS X nicht. Nicht alle Funktionen von gcc sind auf MacOS X implementiert. Apple wird gcc in zukünftigen Versionen des Betriebssystems nicht einmal verwenden.

Ich weiß nicht, wie man mit “-static” verknüpft. Ich kann mir keinen Grund vorstellen, dies unter MacOSX zu tun. Wenn ich wüsste, warum Sie “-static” verwenden wollten, würde mich das Problem vielleicht mehr interessieren. Momentan verstehe ich es einfach nicht. Indem Sie um Hilfe bitten, fragen Sie im Wesentlichen nach Mitarbeitern für das Projekt – auch wenn es nur für 10 Minuten ist. Sie müssen mich interessieren.

Und http://developer.apple.com/library/mac/#qa/qa2001/qa1118.html

Das statische Verknüpfen von Benutzer-Binärdateien wird unter Mac OS X nicht unterstützt. Das Verknüpfen von Benutzer-Binärdateien mit der internen Implementierung von Mac OS X-Bibliotheken und -Schnittstellen würde unsere Fähigkeit einschränken, Mac OS X zu aktualisieren und zu verbessern. Stattdessen wird dynamisches Verknüpfen unterstützt (Verknüpfen mit crt1. o automatisch statt zum Beispiel nach crt0.o zu suchen).

Wir empfehlen Ihnen dringend, die Einschränkungen der statischen Verknüpfung sehr sorgfältig zu prüfen und Ihre Kunden und ihre Bedürfnisse sowie den langfristigen Support, den Sie bereitstellen müssen, zu berücksichtigen.

Update: Das Verbotene ist eine statische Binärdatei. Aber Sie können immer noch eine statische Bibliothek kompilieren und sie mit einem anderen Programm verwenden. Das Programm wird statisch mit Ihrer Bibliothek verknüpft, aber andere Bibliotheken wie libc sind dynamisch, sodass das Programm eine dynamische ausführbare Datei ist.

  • ein Grund zu verwenden -static in der Kompilierung wird in der Erstellung von Kerneln sein. Ich bin vor kurzem auch auf dieses Problem gestoßen. Bedeutet dies, dass man auf einem OS X-Rechner keinen Kernel entwickeln kann?

    – Igbanam

    14. April 2013 um 5:14 Uhr

  • Das Binden des Kernels (OS-Kernel) ist in jedem Fall eine besondere Phase. Kernel hat normalerweise keine externen Bibliotheken (sog. freistehender Modus der C-Sprache, -nostdlib und -nodefaultlibs gcc-Option; es werden keine crt*-Dateien verwendet) und nicht mit dem typischen Objektformat (ELF/Mach-O; oder zumindest nicht mit dem dynamischen Linker ld.so) verknüpft ist. Ein spezielles Linker-Skript und etwas Nachbearbeitung werden verwendet, um das Objekt in ein rohes binäres Boot-Image zu konvertieren. Ich glaube also, dass es möglich ist, den Darwin-Kernel unter Mac OS X zu kompilieren.

    – osgx

    14. April 2013 um 12:32 Uhr

  • Ich bin neu in c, aber ich kann mindestens 3 Gründe für Statik sehen: Pädagogik (nach AC-Buch), Portabilität, Stabilität (wenn Sie versehentlich eine verknüpfte Datei löschen, funktioniert die ausführbare Datei nicht).

    – ling

    19. August 2015 um 18:47 Uhr


Eine Binärdatei ohne dynamisch geladene Bibliotheken kann nicht unter OSX erstellt werden. Ich habe sowohl Apple llvm-gcc als auch Macports gcc ausprobiert. Was jedoch bisher nicht erwähnt wurde, ist, dass dies nicht erforderlich ist. Sie können die c/c++-Bibliothek statisch verknüpfen (und mit einem dynamischen Teil leben).

Datei hello.cpp:

#include <iostream>
using namespace std; 
int main()
{
    cout << "Hello World!";
}

Wie gewohnt kompilieren:

g++ hello.cpp -o hello

Verknüpfung prüfen:

otool -L hello
hello:
/usr/lib/libstdc++.6.dylib (compatibility version 7.0.0, current version 52.0.0)
/usr/lib/libSystem.B.dylib (compatibility version 1.0.0, current version 159.1.0)

Wir können die libSystem.B.dylib-Abhängigkeit nicht loswerden, aber mit macports gcc können wir dies tun:

g++-mp-4.6 -static-libgcc -static-libstdc++ hello.cpp -o hello

otool -L hello
hello:
/usr/lib/libSystem.B.dylib (compatibility version 1.0.0, current version 159.1.0)

Anscheinend unterstützt nur Apple keine statische Verknüpfung:

llvm-g++ -static-libgcc -static-libstdc++ hello.cpp -o hello

otool -L hello
hello:
/usr/lib/libstdc++.6.dylib (compatibility version 7.0.0, current version 52.0.0)
/usr/lib/libSystem.B.dylib (compatibility version 1.0.0, current version 159.1.0)

  • Tut -static-libgcc -static-libstdc++ Arbeit für gcc (nicht g++)?

    – Hanxue

    2. Dezember 2013 um 15:14 Uhr

  • -static-libstdc++ wird für C-Programme nicht benötigt, nur für C++-Programme. Also, ja, beide Optionen funktionieren auch mit gcc.

    – osgx

    13. April 2014 um 17:00 Uhr

Stellen Sie sich vor, Sie möchten einige Funktionen in eine Bibliothek umwandeln.

Datei: example.c

#include <stdio.h>

void aFunction( int a )
{
    printf( "%d\n", a );
}

Datei: example.h

void aFunction( int a );

Datei: main.c

#include "example.h"

int main( ) 
{
    aFunction( 3 );

    return 0;
}

So erstellen Sie die Bibliothek:

gcc -c example.c
ar -r libmylibrary.a  example.o

So verknüpfen Sie die Bibliothek:

gcc main.c -lmylibrary -L. -I.

Und dann ist die Datei example.c ein statischer Build des gesamten Programms.

  • Wie kann ich bestätigen, dass es sich um einen statischen Build handelt?

    – Daniel

    10. März 2011 um 12:16 Uhr

  • Aber das Programm a.out wird dynamisch gelinkt!

    – osgx

    10. März 2011 um 12:17 Uhr

  • Mit anderen Worten, Sie können eine Bibliothek statisch kompilieren, aber kein Programm?

    – Daniel

    10. März 2011 um 12:18 Uhr

  • Der Präprozessor fügt den Code der Bibliothek in die endgültige ausführbare Datei ein. Wenn die Funktion “aFunction” erforderlich ist, muss das Betriebssystem nicht mit der Bibliothek verbunden werden, da sich der Code in der ausführbaren Datei befindet.

    – momboco

    10. März 2011 um 12:21 Uhr

  • @momboco, kein Präprozessor, sondern ein Linker (ld)

    – osgx

    10. März 2011 um 12:23 Uhr

1395180cookie-checkErstellen eines statischen Mac OS XC-Builds

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy