Как создать статическую сборку файла .c на Mac OS X? Когда я пытаюсь:
gcc -o test Main.c -static
Я получаю:
ld: library not found for -lcrt0.o
collect2: ld returned 1 exit status
Как создать статическую сборку файла .c на Mac OS X? Когда я пытаюсь:
gcc -o test Main.c -static
Я получаю:
ld: library not found for -lcrt0.o
collect2: ld returned 1 exit status
Он не поддерживается в 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, будут динамическими, поэтому программа будет динамическим исполняемым файлом.
В 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)
Представьте, что вы хотите преобразовать некоторые функции в библиотеку.
Файл: 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 представляет собой статическую сборку всей программы.