web-dev-qa-db-ja.com

静的なMac OS X Cビルドの作成

Mac OS Xで.cファイルの静的ビルドを作成するにはどうすればよいですか?私が試したとき:

gcc -o test Main.c -static

私は得ます:

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

Mac OS Xのgccではサポートされていません。

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

おそらく、「-static」フラグのフラットアウトはMacOS Xでは機能しません。gccのすべての機能がMacOS Xで実装されているわけではありません。Appleは、 OS。

「-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などの他のライブラリは動的になるため、プログラムは動的な実行可能ファイルになります。

28
osgx

動的に読み込まれるライブラリを持たないバイナリは、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)
16
gbasler

一部の関数をライブラリに変換したいとします。

ファイル: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はプログラム全体の静的ビルドです。

7
momboco