Подтвердить что ты не робот

Создание статической сборки Mac OS X C

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

gcc -o test Main.c -static

Я получаю:

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

Ответ 1

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

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

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

Я не знаю, как использовать ссылку "-статический" . Я не могу придумать никаких оснований для этого на MacOSX. Если бы я знал, почему вы хотите использовать "-статический" , мне может быть больше интересна проблема. Прямо сейчас, я просто не понимаю. Обратившись за помощью, вы, по сути, просите о совместной работе над проектом, даже если это всего лишь 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, будут динамическими, поэтому программа будет динамическим исполняемым файлом.

Ответ 2

В OSX невозможно создать двоичный файл, который не имеет динамически загружаемых библиотек. Я попробовал как llvm-gcc, так и maccc gcc. Однако то, о чем не упоминалось до сих пор, заключается в том, что это не требуется. Вы можете связать библиотеку 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)

Ответ 3

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

Файл: 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 представляет собой статическую сборку всей программы.