gcc / cmake를 사용하여 64 비트 Linux 시스템에서 32 비트 바이너리를 컴파일하는 방법


129

그것은에서 프로젝트를 컴파일하는 것이 가능 32 비트 와 cmake와 gccA의 64 비트 시스템? 그럴 수도 있지만 어떻게해야합니까?

매개 변수 / 플래그 / 등을 설정하지 않고 "무지한"방법을 시도했을 때 LD_LIBRARY_PATH연결된 라이브러리를 찾기 위해 설정 ~/tools/lib하면 무시하고 lib64 라는 하위 디렉토리 만 찾습니다 .


1
플래그 -m32를 gcc에 전달하는 것으로 충분합니까? 그렇다면 cmake에서 어떻게해야합니까?
— dala

답변:


124
export CFLAGS=-m32

2
해야합니다. 또한 32 비트 대상을 만들 수 cmake 스크립트를 수정할 수 있습니다 - 그냥 추가 할 -m32받는 사람 CFLAGS아마 설정에 의해, CMAKE_REQUIRED_FLAGS.
— caf

5
문제는 이것이 반드시 충분하지 않다는 것입니다. 링커도 조정해야 할 수도 있습니다!
— lpapp

6
무슨 export뜻입니까? 어디에 속합니까? 테 헤더 파일? makefile? 아뇨, 초보자에게는 전혀 답이 아닙니다.
— Tomáš Zato-복원 모니카

1
@ TomášZato : 셸 프롬프트에서 호출하기 전에 cmake(그러나 Makefile이 있으면 make대신 사용 하고 있습니다).
— caf

4
@ caf, 답변을 자세히 설명해 주시겠습니까? 당신의 대답은 매우 간결하며 아무 것도 설명하지 않습니다.
— Bulat M.

76
$ gcc test.c -o testc
$ 파일 testc
testc : GNU / Linux 2.6.9 용 ELF 64 비트 LSB 실행 파일, x86-64, 버전 1 (SYSV), 동적 링크 (공유 라이브러리 사용)
$ ldd testc 
    linux-vdso.so.1 => (0x00007fff227ff000)
    libc.so.6 => /lib64/libc.so.6 (0x000000391f000000)
    /lib64/ld-linux-x86-64.so.2 (0x000000391ec00000)
$ gcc -m32 test.c -o testc
$ 파일 testc
testc : GNU / Linux 2.6.9 용 ELF 32 비트 LSB 실행 파일, Intel 80386, 버전 1 (SYSV), 동적 링크 (공유 라이브러리 사용)
$ ldd testc
    linux-gate.so.1 => (0x009aa000)
    libc.so.6 => /lib/libc.so.6 (0x00780000)
    /lib/ld-linux.so.2(0x0075b000)

간단히 말해 : -m32플래그를 사용하여 32 비트 바이너리를 컴파일하십시오.

또한 필요한 모든 라이브러리의 32 비트 버전이 설치되어 있는지 확인하십시오 (필자의 경우 Fedora에서 필요한 것은 glibc-devel.i386입니다)


1
큰 감사합니다! 예, 32 비트 버전의 종속성이 있습니다.
— dala

6
32 비트 버전의 라이브러리를 어떻게 설치합니까?
— Tomáš Zato-복원 모니카

2
@ TomášZatosudo apt-get install gcc-multilib
— Matthew Murdoch

16

이후 버전의 CMake에서 각 대상에서 수행하는 한 가지 방법은 다음과 같습니다.

set_target_properties(MyTarget PROPERTIES COMPILE_FLAGS "-m32" LINK_FLAGS "-m32")

나는 그것을 세계적으로 할 수있는 방법을 모른다.


+1. 64 비트 스노우 레오파드에서 32 비트 taglib ( developer.kde.org/~wheeler/taglib.html ) 를 만들려고합니다 . 이것은 나를 위해 작동합니다.
— edwardw

3
… 그것을 전 세계적으로하기 위해 :cmake -D CMAKE_CXX_FLAGS=-m32 . && make
— dyomas

7

C ++의 경우 다음을 수행 할 수 있습니다.

export CXXFLAGS=-m32

이것은 cmake와 함께 작동합니다.


6

한 가지 방법은 chroot 환경을 설정하는 것입니다. 데비안은 debootstrap 과 같은 다양한 툴을 가지고 있습니다


2
32 비트 응용 프로그램을 빌드하기 위해 chroot 환경을 설정하는 것이 약간 극단적이라고 생각합니까? 당신이 그것을 추천하는 특별한 이유가 있습니까?
— Fredrik

3
또한 코드를 실행할 수있는 완벽한 환경을 제공합니다. 우리는 이것을 사용하여 64 비트 호스트에서 전체 32 비트 바이너리를 빌드하고 실행합니다. 때로는 32 비트 빌드의 타사 라이브러리 만 얻습니다. 데비안 작업의 경우 64 비트 호스트에서 32 비트 패키지를 빌드하는 데 사용합니다.
— Dirk Eddelbuettel

Linux, Solaris 또는 다른 64 비트 플랫폼에서 전체 32 비트 바이너리를 빌드하고 실행하는 데 아무런 문제가 없었습니다. 그러나 나는 데비안을 많이 사용하지 않습니다.
— Fredrik

Frederik, 64 비트 빌드 호스트에서도 32 비트로 배포합니까?
— Dirk Eddelbuettel

@Dirk : 32 비트 바이너리는 32 비트와 64 비트 머신 모두에서 작동하지만 64 비트 바이너리는 64 비트 머신에서만 작동합니다. 고객 머신인지 빌드 호스트인지는 중요하지 않습니다. 솔직히 커널 모듈이 아니라면 문제가 어디에 있는지 알지 못합니다.
— Fredrik

6

복잡한 응용 프로그램의 경우 lxc 컨테이너 를 사용하는 것이 좋습니다 . lxc 컨테이너는 '스테로이드의 chroot와 본격적인 가상 머신 사이의 중간에있는 것'입니다.

예를 들어, Ubuntu Trusty 시스템에서 lxc를 사용하여 32 비트 와인을 만드는 방법은 다음과 같습니다.

sudo apt-get install lxc lxc-templates
sudo lxc-create -t ubuntu -n my32bitbox -- --bindhome $LOGNAME -a i386 --release trusty
sudo lxc-start -n my32bitbox
# login as yourself
sudo sh -c "sed s/deb/deb-src/ /etc/apt/sources.list >> /etc/apt/sources.list"
sudo apt-get install devscripts
sudo apt-get build-dep wine1.7
apt-get source wine1.7
cd wine1.7-*
debuild -eDEB_BUILD_OPTIONS="parallel=8" -i -us -uc -b
shutdown -h now   # to exit the container

다음은 lxc를 사용하여 64 비트 호스트에서 32 비트 와인을 빌드하는 방법에 대한 위키 페이지 입니다.


흥미 롭군 atom64 비트 컴퓨터에서 32 비트 용 텍스트 편집기 를 컴파일하는 데 사용할 수 있습니까 ?
— Anwar

1
@Anwar, 나는 그렇게 생각한다. 무엇이든 구축하는 것이 좋습니다.
— Sam Watkins
당사 사이트를 사용함과 동시에 당사의 쿠키 정책과 개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.