programing

정적 Mac OS XC 빌드 생성

lastmoon 2023. 8. 10. 19:10
반응형

정적 Mac OS XC 빌드 생성

Mac OS X에서 .c 파일의 정적 빌드를 만들려면 어떻게 해야 합니까?

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은 향후 버전의 OS에서도 gcc를 사용하지 않을 것입니다.

"-static"을 사용하여 연결하는 방법을 모르겠습니다.MacOSX에서 그렇게 해야 할 이유가 없습니다.당신이 "-static"을 사용하려는 이유를 안다면 저는 그 문제에 더 관심이 있을 것입니다.지금은 이해가 안 돼요도움을 요청하는 것은 기본적으로 프로젝트에 대한 협력자를 요청하는 것입니다. 단 10분만 프로젝트에 참여해도 됩니다.당신은 나에게 관심을 가질 필요가 있습니다.

그리고 http://developer.apple.com/library/mac/ #qa/qa2001/qa1118.html

Mac OS X에서는 사용자 바이너리의 정적 연결이 지원되지 않습니다.사용자 바이너리를 Mac OS X 라이브러리 및 인터페이스의 내부 구현에 연결하면 Mac OS X를 업데이트하고 향상시키는 기능이 제한됩니다. 대신 동적 연결이 지원됩니다(예: crt0.o를 찾는 대신 자동으로 crt1.o에 연결).

정적 연결의 한계를 매우 신중하게 고려하고, 고객과 고객의 요구, 그리고 제공해야 할 장기적인 지원을 고려할 것을 강력히 권장합니다.

업데이트: 금지된 이진이 정적 이진입니다.그러나 일부 정적 라이브러리를 컴파일하여 다른 프로그램과 함께 사용할 수 있습니다.프로그램은 라이브러리와 정적으로 연결되지만 libc와 같은 다른 라이브러리는 동적이므로 프로그램은 동적 실행 파일이 됩니다.

동적으로 로드된 라이브러리가 없는 이진은 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)

애플만 정적 링크를 지원하지 않는 것 같습니다.

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 파일은 전체 프로그램의 정적 빌드입니다.

언급URL : https://stackoverflow.com/questions/5259249/creating-static-mac-os-x-c-build

반응형