최근 Mac에서 다른 라이브러리를 사용하는 호환되지 않는 라이브러리 아키텍처에 대한 오류가있는 오픈 소스 라이브러리를 컴파일하는 중 일부 문제가 발생했습니다. 누군가 특정 아키텍처에 대한 C 프로그램을 컴파일하는 개념을 설명 할 수 있습니까? 나는 전에 -arch
컴파일러 플래그를 보았고, "CPU"언어에 매핑한다고 가정하는 ppc
, i386
및 x86_64
과 같은 값이 전달 된 것을 보았습니다. 그러나 여기서 나의 이해는 멈 춥니 다. 한 프로그램에서 특정 아키텍처를 사용하는 경우로드하는 모든 라이브러리도 동일한 아키텍처에 있어야합니까? 주어진 프로그램/프로세스가 어떤 아키텍처에서 실행되고 있는지 어떻게 알 수 있습니까?특정 아키텍처의 C 프로그램 컴파일
답변
누군가 특정 아키텍처의 C 프로그램을 컴파일하는 개념을 설명 할 수 있습니까?
예. 이 아이디어는 C를 이진 형식으로 코딩 된 프로그램이있는 고유 한 기계 명령어 시퀀스로 변환하는 것입니다. 여기서 "아키텍처"의 의미는 명령어가 바이너리로 코딩되는 방식 인 "명령어 세트 아키텍처"입니다. 예를 들어, 모든 아키텍처에는 두 개의 정수를 더하는 명령어를 코딩하는 고유 한 방식이 있습니다.
기계 명령어로 컴파일하는 이유는 명령어가 매우 빠르게 실행된다는 것입니다.
하나의 프로그램이 특정 아키텍처를 사용하는 경우로드하는 모든 라이브러리도 동일한 아키텍처에 있어야합니까?
예. (예외는 있지만 드물다.)
, 그것은, 유닉스 명령주어진 프로그램/프로세스가 실행중인 아키텍처를 어떻게 알 수 있습니까?프로세스가 하드웨어에서 실행중인 경우 인간의 독자
uname -a
의 출력이 더 많은 정보를 수 있지만
uname -m
을 실행하여 발견 할 수있는 기본 아키텍처에서 실행되고 있습니다.
당신은 실행 가능한 바이너리 또는 공유 라이브러리 (.so를 파일)이있는 경우, 당신은 file
명령을 사용하여 구조를 발견 할 수 있습니다 :
% file /lib/libm-2.10.2.so
/lib/libm-2.10.2.so: ELF 32-bit LSB shared object, Intel 80386, version 1 (SYSV), dynamically linked (uses shared libs), for GNU/Linux 2.6.18, stripped
% file /bin/ls
/bin/ls: ELF 32-bit LSB executable, Intel 80386, version 1 (SYSV), dynamically linked (uses shared libs), for GNU/Linux 2.6.8, stripped
당신이 바이너리는 아주 오래된 컴파일 된 것을 볼 수 있습니다 내 하드웨어가 더 현대적인 i686이지만 80386 아키텍처. i686 (Pentium Pro)은 80386과 호환되며 80386 바이너리와 원시 바이너리를 실행합니다. 이러한 역 호환성을 가능하게하기 위해 인텔은 많은 문제와 비용으로 —으로 갔지만 실제로는 데스크톱 CPU로 시장을 공략했기 때문에 가치가있었습니다.
CPU와 다른 아키텍처를 구현하려면 크로스 컴파일러가 필요합니다. 즉, 생성 된 코드가 사용자가 앉아있는 컴퓨터에서 네이티브로 실행할 수 없음을 의미합니다. GCC는 이걸 잘 할 수 있습니다. 프로그램이 빌드 된 아키텍처를 확인하려면 파일 명령을 확인하십시오. Linux 기반 시스템에서 적어도 32 비트 x86 프로그램은 32 비트 x86 라이브러리가 필요합니다. 나는 그것이 대부분의 OS에 대해 같다고 생각한다.
여기서 혼란 스러울 수있는 점은 Mac 플랫폼에 실제로 universal binary이라고 부르는 내용이 있다는 것입니다.이 내용은 실제로 하나의 아카이브에서 2 개의 바이너리로, 하나는 Intel 용이고 다른 하나는 ppc 아키텍처 용입니다. 컴퓨터가 실행할 컴퓨터를 자동으로 결정합니다. 에뮬레이션 모드에서 다른 아키텍처 용 바이너리를 실행할 수 있으며 일부 아키텍처는 다른 아키텍처의 상위 집합입니다 (즉, i386 코드는 일반적으로 i486, i586, i686 등에서 실행됩니다).하지만 대부분의 경우 유일한 코드입니다 당신은 당신의 프로세서 아키텍처를위한 코드를 실행할 수 있습니다.
크로스 컴파일의 경우 프로그램뿐 아니라 사용하는 모든 라이브러리가 대상 프로세서와 호환되어야합니다. 때로는 두 번째 컴파일러가 설치되는 것을 의미합니다. 가끔은 컴파일러에 맞는 적절한 추가 모듈을 제공하는 것입니다. gcc is actually a seperate executable, though it can sometimes be accessed via a command line switch 용 교차 컴파일러. 다양한 아키텍처를위한 gcc 크로스 컴파일러는 개별 설치가 가능합니다.
ldd이 경우 도움이 되나요?
- 1. 리눅스에서 C++ 프로그램 컴파일
- 2. Objective-C 프로그램 컴파일
- 3. mips 아키텍처의 memcached-1.4.5 컴파일 문제?
- 4. 특정 종속성이나 크기가없이 Win32 응용 프로그램 컴파일
- 5. VS2010의 C++ 메타 프로그램 컴파일
- 6. Windows XP에서 C++ 프로그램 컴파일
- 7. SPARC 아키텍처의 C++ 버스 오류
- 8. 전혀 다른 아키텍처의 iPad 응용 프로그램 업데이트
- 9. 핵심 i5/7 아키텍처의 프로그램 런타임 결정
- 10. 변형 응용 프로그램 아키텍처의 좋은 예
- 11. 다른 아키텍처의 dylib로드
- 12. C++ 컴파일 시간 프로그램 고유 번호
- 13. C 프로그램 컴파일 오류 : 정의되지 않은 참조
- 14. SciTE를 사용하여 C 프로그램 컴파일/빌드/실행
- 15. Mac OS X에서 libpng로 C 프로그램 컴파일
- 16. xcode 컴파일 콘솔 응용 프로그램 - C 프로그래밍
- 17. g ++에서 Windows C++ 프로그램 컴파일
- 18. Windows 용 Linux 응용 프로그램 컴파일 (C)
- 19. 부스트 신호로 VS8 C++ 프로그램 컴파일 문제
- 20. dbus 헤더 파일을 사용하여 C 프로그램 컴파일
- 21. nmake를 사용하여 컴파일 된 C 프로그램 디버그
- 22. cutil 함수 컴파일 프로그램
- 23. 이전 프로그램 디 컴파일
- 24. 특정 부스트 라이브러리 컴파일
- 25. 특정 파일의 XCode 컴파일
- 26. 특정 상대 경로에 대한 GWT 응용 프로그램 컴파일
- 27. OSX에서 OpenGL 및 Xm에 대한 C/C++ 응용 프로그램 컴파일
- 28. 스레드 프로그램 컴파일
- 29. sse3없이 gnu 프로그램 컴파일
- 30. JBoss AS 기반 응용 프로그램 아키텍처의 이점은 무엇입니까?