Computer >> 컴퓨터 >  >> 프로그래밍 >> C++

64비트 GCC에서 32비트 C/C++ 프로그램 컴파일하는 방법

요즘 배포되는 컴파일러는 대부분 기본적으로 64비트 버전으로 제공됩니다. 하지만 때로는 작성한 코드를 32비트 시스템에서 컴파일하고 실행해야 하는 경우가 있습니다. 이럴 때 GCC가 제공하는 -m32 옵션을 활용하면 됩니다.

1. 현재 GCC의 타깃 아키텍처 확인하기

먼저 현재 사용 중인 GCC 컴파일러의 타깃 버전이 무엇인지 확인해야 합니다. 터미널에서 다음 명령어를 입력합니다.

gcc –v
Using built-in specs.
COLLECT_GCC=gcc
COLLECT_LTO_WRAPPER=/usr/lib/gcc/x86_64-linux-gnu/7/lto-wrapper
OFFLOAD_TARGET_NAMES=nvptx-none
OFFLOAD_TARGET_DEFAULT=1
Target: x86_64-linux-gnu
...........
...........
...........

출력 결과에서 Target: x86_64-linux-gnu라고 표시된 것을 볼 수 있습니다. 이는 현재 64비트 버전의 GCC를 사용하고 있다는 의미입니다.

2. -m32 옵션으로 32비트 컴파일하기

32비트 시스템용으로 코드를 컴파일하려면 다음과 같이 -m32 플래그를 붙여 실행합니다.

gcc –m32 program_name.c

3. 발생할 수 있는 오류와 해결 방법

위 명령어를 실행했을 때 아래와 같은 오류가 발생할 수 있습니다. 이는 GCC의 32비트 표준 라이브러리가 시스템에 설치되어 있지 않다는 의미입니다.

In file included from test_c.c:1:0:
/usr/include/stdio.h:27:10: fatal error: bits/libc-header-start.h: No such file or directory
#include <bits/libc-header-start.h>
^~~~~~~~~~~~~~~~~~~~~~~~~~
compilation terminated.

이 문제를 해결하려면 멀티라이브러리(multilib) 패키지를 설치해야 합니다. 다음 명령어를 순서대로 실행합니다.

sudo apt-get install gcc-multilib
sudo apt-get install g++-multilib

C뿐만 아니라 C++ 프로그램도 32비트로 컴파일할 수 있도록 두 패키지를 모두 설치하는 것이 좋습니다.

4. 32비트와 64비트 환경의 차이 확인하기

설치가 완료되면 간단한 예제 코드를 통해 32비트 시스템과 64비트 시스템에서 실행 결과가 어떻게 달라지는지 확인할 수 있습니다.

예제 코드

#include<stdio.h>
main() {
    printf("The Size is: %lu\n", sizeof(long));
}

이 코드는 long 자료형의 크기를 출력합니다. 자료형 크기는 시스템 아키텍처에 따라 달라질 수 있습니다.

64비트로 컴파일한 경우

$ gcc test_c.c
test_c.c:3:1: warning: return type defaults to 'int' [-Wimplicit-int] main(){
^~~~
$ ./a.out
The Size is: 8

64비트 환경에서는 long형의 크기가 8바이트로 출력됩니다.

32비트(-m32)로 컴파일한 경우

$ gcc -m32 test_c.c
test_c.c:3:1: warning: return type defaults to 'int' [-Wimplicit-int]
main(){
^~~~
test_c.c: In function 'main':
test_c.c:4:28: warning: format '%lu' expects argument of type 'long unsigned int', but argument 2 has type 'unsigned int' [-Wformat=]
printf("The Size is: %lu\n", sizeof(long));
~~^
%u
$ ./a.out
The Size is: 4

32비트 환경에서는 long형의 크기가 4바이트로 출력됩니다. 또한 포맷 문자열 관련 경고가 함께 나타나는데, 32비트에서는 sizeof(long)의 반환 타입이 unsigned int에 해당하기 때문입니다. 경고를 없애려면 포맷 지정자를 %u로 바꾸거나 캐스팅을 활용하면 됩니다.

정리

이처럼 GCC의 -m32 옵션과 multilib 패키지만 있으면 64비트 개발 환경에서도 손쉽게 32비트용 프로그램을 빌드하고 테스트할 수 있습니다. 임베디드 개발이나 구형 시스템 호환성 검증이 필요한 경우 유용하게 활용해 보시기 바랍니다.