64 비트 우분투에서 32 비트 앱 빌드


23

인터넷 검색 후 몇 시간을 포기하고 전문가에게 문의하기로 결정했습니다. 64 Ubuntu 11.10에서 32 비트 응용 프로그램 (누가 관심이 있다면 xgap)을 만들려고합니다. 나는 추가 CFLAGS = -m32LDFLAGS = -L는 / usr / lib32를 메이크에. 객체는 32 비트로 잘 구성되어 있습니다. 마지막 단계는 X 윈도우의 모든 객체와 라이브러리를이 실행 파일 인 xgap에 연결하는 것입니다. 어떻게 든이 오류가 계속 발생합니다.

gcc -o xgap xcmds.o utils.o gapgraph.o gaptext.o pty.o popdial.o xgap.o selfile.o   -L/usr/lib32 -lXaw -lXmu -lXt -lXext -lX11  -lSM -lICE

/usr/bin/ld: skipping incompatible /usr/lib32/libXmu.so when searching for -lXmu
...

/usr/bin/ld: i386 architecture of input file `xcmds.o' is incompatible with i386:x86-64 output
...

내가 설치 한 IA32 - libs와mutilib 지원 . 링커가 i386 출력을 생성하도록 강요해야한다고 생각합니다. 위와 같이 gcc 명령 에 두 개의 ld 플래그 를 넣으려고했습니다 : -melf_i386-oformat elf32-i386 . 그러나 gcc는 더 이상 / usr / lib32 에서 32 비트 라이브러리를 검색하지 않습니다 . 고정 된 순서로 해당 플래그를 넣어야하는지 궁금합니다.

어떤 아이디어와 도움을 주셔서 감사합니다!

편집 : 마지막 gcc 명령 (내가 믿는 연결 단계)에 -m32 플래그를 추가하면 -L / usr / lib32 플래그가 있더라도 gcc는 더 이상 / usr / lib32에서 검색하지 않습니다 (정말 weird ...) 다음 오류를 생성합니다.

/usr/bin/ld: skipping incompatible /usr/lib/gcc/x86_64-linux-gnu/4.6.1/../../../libXaw.so when searching for -lXaw
/usr/bin/ld: skipping incompatible /usr/lib/libXaw.so when searching for -lXaw
/usr/bin/ld: cannot find -lXaw
collect2: ld returned 1 exit status

왜 이런 일이 일어나는지 아는 사람이 있습니까? 자동 도구를 사용하여 구성하고 만듭니다. 스크립트 파일을 수정하는 것이 정말 좋습니다.

EIDT : 문제를 해결했습니다. gcc 는 정적 라이브러리 아카이브를 기대하고 있다고 생각합니다 . http://ubuntuforums.org/showthread.php?t=474790getlibs 스크립트를 사용하여 링크에 필요한 모든 .a 아카이브를 다운로드했습니다. 그런 다음 gcc 는 일했습니다. 내 생각 GCC가 에서 검색을했다 는 / usr / lib32 디렉토리 만 찾을 수 없습니다 .A의 아카이브 그렇게되는 표준 디렉토리 검색에 갔다 는 / usr / lib 디렉토리 는 호환되지 않는 발견, .so를 * 파일을.

그러나 문제는 패키지 ia32-libs의 / usr / lib32 / 에 있는 * .so 파일에 실제로 링크에 필요한 라이브러리 가없는 것입니다. / usr / lib32 / 에있는 파일은 무엇에 사용됩니까?



답변:


15

LDFLAGS포함해야 -m32합니다. 다음과 같이 작동합니다.

export LDFLAGS='-m32 -L/usr/lib32'

실제로 -L/usr/lib3232 비트 라이브러리의 기본 디렉토리이므로 시스템에서이를 인식하고 있기 때문에 부분 을 삭제할 수 있습니다 .

기본적으로 64 비트 시스템에서 32 비트 애플리케이션을 빌드하는 가장 간단한 방법은 다음과 같습니다.

export CFLAGS='-m32'
export CXXFLAGS='-m32'
export LDFLAGS='-m32'
make

.. 또는 구성 스크립트에 해당 변수를 공급 당신이 autotools를를 사용하는 경우.

최신 정보:

정적 라이브러리와 동적 라이브러리와의 링크 차이점에 대해 잘 모르는 것 같습니다. 최대한 최소화하려고 노력할 것입니다.

  • 정적 및 동적 개발 라이브러리는 모두 동일한 파일 확장자를 갖습니다. .a
  • 동일한 라이브러리의 정적 및 동적 버전을 모두 설치 한 경우 libname.a동적 및 libname_s.a정적 버전 과 같은 추가 접미사가있을 수 있습니다 .
  • 물론 정적 및 동적 라이브러리 버전은 크기가 다릅니다. 정적 버전이 더 무겁습니다.
  • 정적 라이브러리와 연결하면 응용 프로그램에 종속성이 없습니다. 동적 라이브러리와 링크하는 경우 .so시스템에 있어야 하는 런타임 라이브러리에 의존 합니다.

여기서는 dlopen () / dlsym () API를 사용하여 DSO를 명시 적으로로드하는 것과 같은 고급 트릭에 대해서는 이야기하지 않습니다.


이제 설정에 문제가 있다고 생각합니다. 마지막 gcc 명령에 -m32를 추가 할 때마다 / usr / lib 폴더를 검색합니다. -m32를 추가하지 않고 -L / usr / lib32 플래그를 사용하면 올바른 디렉토리를 검색하지만 위의 오류가 발생합니다. 이 문제의 원인을 알고 있습니까?
Rich

위의 예와 같이 두 가지를 결합하면 어떻게됩니까?
Andrejs Cainikovs

둘 다 결합해도 여전히 / usr / lib32에서 검색되지 않습니다. 단지 / usr / lib에서 검색합니다. 그리고 btw, 나는 자동 도구를 사용하고 있습니다.
Rich

이상한 .. 당신은 -l/usr/lib32/libXaw.so대신 먹이를 시도 했습니까 ?
Andrejs Cainikovs

찾을 수 없습니다 .... : gcc -o xgap xcmds.o utils.o gapgraph.o gaptext.o pty.o popdial.o xgap.o selfile.o -O2 -L / usr / lib32 -l / usr / lib32 / libXaw.so -l / usr / lib32 / libXmu.so -l / usr / lib32 / libXt.so -l / usr / lib32 / libXext.so -l / usr / lib32 / libX11.so -l / usr / lib32 / libSM.so -l / usr / lib32 / libICE.so -m32 / usr / bin / ld : -l / usr / lib32 / libXaw.so를 찾을 수 없음
Rich

9

다음과 같은 오류가 발생했습니다.

/usr/bin/ld: skipping incompatible /usr/lib/gcc/x86_64-linux-gnu/4.8/libstdc++.so when searching for -lstdc++

이것은 나를 위해 그것을 고쳤다 :

sudo apt-get install g++-multilib

기본 패키지 이외의 gcc 패키지 (예 :)를 사용하는 경우 gcc-7해당 특정 버전의 패키지를 설치해야합니다.

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

1
g++-multilibg ++ (C ++), gcc (C), 또한 필요합니다 gcc-multilib.
pevik
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.