Создание статической сборки Mac OS XC - PullRequest
31 голосов
/ 10 марта 2011

Как я могу создать статическую сборку файла .c в Mac OS X? Когда я пытаюсь:

gcc -o test Main.c -static

Я получаю:

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

Ответы [ 3 ]

28 голосов
/ 10 марта 2011

Не поддерживается в gcc Mac OS X:

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

Возможно, что флаг "-static" не будет работать в MacOS X. Не все функции gcc реализованы в MacOS X. Apple даже не будет использовать gcc в будущих версиях ОС.

Я не знаю, как связать, используя "-static". Я не могу думать о какой-либо причине сделать это на MacOSX. Если бы я знал, почему вы хотите использовать «-static», я бы больше интересовался этой проблемой. Прямо сейчас я просто не понимаю. Обращаясь за помощью, вы, по сути, обращаетесь к сотрудникам по проекту, даже если это всего лишь на 10 минут. Вы должны заинтересовать меня.

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

Статическое связывание пользовательских двоичных файлов не поддерживается в Mac OS X. Привязка пользовательских двоичных файлов к внутренней реализации библиотек и интерфейсов Mac OS X ограничит нашу способность обновлять и улучшать Mac OS X. Вместо этого поддерживается динамическое связывание (связывание к crt1.o автоматически вместо поиска crt0.o, например).

Мы настоятельно рекомендуем вам очень внимательно рассмотреть ограничения статического связывания, а также учесть своего клиента и его потребности, а также долгосрочную поддержку, которую вам необходимо будет предоставить.

Обновление: запрещен статический двоичный файл. Но вы все еще можете скомпилировать статическую библиотеку и использовать ее с другой программой. Программа будет статически связана с вашей библиотекой, но другие библиотеки, такие как libc, будут динамическими, поэтому программа будет динамически исполняемым.

16 голосов
/ 29 декабря 2011

Двоичный файл, который не имеет динамически загружаемых библиотек, не может быть собран под OSX. Я пробовал как apple llvm-gcc, так и macports gcc. Тем не менее, пока нет ответа, что это не нужно. Вы можете связать библиотеку c / c ++ статически (и жить с какой-то динамической частью).

Файл hello.cpp:

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

Компилировать как обычно:

g++ 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)

Мы не можем избавиться от зависимости libSystem.B.dylib, но с помощью macports gcc мы можем сделать это:

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)

Видимо, просто Apple не поддерживает статические ссылки:

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)
7 голосов
/ 10 марта 2011

Представьте, что вы хотите преобразовать некоторые функции в библиотеку.

Файл: example.c

#include <stdio.h>

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

Файл: example.h

void aFunction( int a );

Файл: main.c

#include "example.h"

int main( ) 
{
    aFunction( 3 );

    return 0;
}

Чтобы создать библиотеку:

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

Чтобы связать библиотеку:

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

А затем файл example.c представляет собойстатическая сборка всей программы.

...