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


129

그것은에서 프로젝트를 컴파일하는 것이 가능 32 비트cmakegccA의 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.