컴파일 문제 : crt1.o를 찾을 수 없음


114

개발에 사용하는 가상 데비안 시스템이 있습니다.

오늘은 llvm / clang을 시도해보고 싶었습니다.

clang을 설치 한 후 이전 c- 프로젝트 (gcc 사용)를 컴파일 할 수 없습니다. 이것은 오류입니다.

...
/usr/bin/ld: cannot find crt1.o: No such file or directory
/usr/bin/ld: cannot find crti.o: No such file or directory
collect2: ld returned 1 exit status
...

clang을 제거했지만 여전히 작동하지 않습니다.

누구든지 내가 이것을 고칠 수있는 방법을 알고 있습니까?


6
설치를 시도하십시오 libc0.1-dev.
Michas 2011-06-13

1
Mac의 경우 다음을 참조하십시오. stackoverflow.com/questions/1365211/…
kenorb 2013


이것은 런치 패드에보고 된 버그입니다. 해결 방법이 있습니다. askubuntu.com/questions/251978/…
Roman

답변:


91

Debian / Ubuntu

문제는 현재 아키텍처에 대한 gcc 만 있고 64 비트라는 것입니다. 32 비트 지원 파일이 필요합니다. 이를 위해 설치해야합니다.

sudo apt install gcc-multilib

2
우분투에서 이것은 작동 sudo apt-get install gcc-multilib하고 내 오류를 수정 했습니다gfortran -m32 ...
randwa1k 2014 년

1
64 대 32 원인을 언급하는보다 구체적인 질문 : stackoverflow.com/questions/21724540/…
Ciro Santilli 郝海东 冠状 病 六四 事件

62

나에게 도움이 된 것은 심볼릭 링크를 만드는 것입니다.

sudo ln -s /usr/lib/x86_64-linux-gnu /usr/lib64

5
이것은 작동하지만 데비안 다중 아키텍처에서 효과적으로 하나의 아치 만 제공합니다.
jeremiah

2
누군가가 내게 tar 번들로 준 크로스 컴파일 도구 체인을 설정하려고 시도하는 것과 동일한 문제가 발생했습니다. gcc가 crt1.o를 찾고있는 곳을보기 위해 strace (예 : "strace gcc <all my arguments> 2> & 1 | grep crt1.o")를 사용해야했기 때문에 생성 할 심볼릭 링크를 파악할 수있었습니다.
Andrew Bainbridge

37

llvm / clang을 사용하는 동안 (또는 패키지 관리자) 기존의 표준 C 라이브러리 개발 패키지 ( Debian의 eglibc )를 제거 했거나 처음에 설치하지 않았을 수 있으므로 다시 설치해야합니다. 이제 gcc로 되돌 렸습니다.

데비안에서 다음과 같이 할 수 있습니다.

aptitude show libc-dev

Ubuntu :

apt-get install libc-dev

Ubuntu에서 libc-dev가없는 경우 packages.ubuntu.com에서 찾을 수 없으므로 libc6-dev를 직접 설치할 수 있습니다.

또는 Redhat 같은 시스템에서 :

yum glibc-devel 설치

NB : 댓글에 간략하게 답변했지만, 여기에 답변이 있습니다. 누군가이 답변을 접하고 답변을 찾고있을 수 있지만 댓글에 없거나 댓글이 충분히 명시 적이 지 않은 경우를 대비하여 기록에 하나가 있습니다. .


1
데비안의 다중 아키텍처가 많은 빌드를 망가 뜨리는 것은 아닙니다. 종종이 오류가 발생합니다. export LD_LIBRARY_PATH가 트릭을 할 수 있습니다.
deadalnix

3
이 고산 리눅스에 대한 도움이apk add libc-dev=0.7.1-r0
유 Jiaao에게

27

이것은 런치 패드에서보고 된 BUG 이지만 해결 방법이 있습니다.

이 파일이 어디에 있는지 확인하려면 이것을 실행하십시오.

$ find /usr/ -name crti*
/usr/lib/x86_64-linux-gnu/crti.o

그런 다음이 경로를 LIBRARY_PATH 변수에 추가하십시오.

$ export LIBRARY_PATH=/usr/lib/x86_64-linux-gnu:$LIBRARY_PATH

14.04에서 작동합니다. 이것은 당신의 시스템의 라이브러리를 난도질하지 않으려면 선호하는 경로입니다
BobTuckerman

17

데비안의 테스팅 버전 인 'wheezy'를 사용하고 있다면 멀티 아치로의 이동에 물렸을 수도 있습니다. 데비안의 멀티 아키에 대한 더 자세한 정보는 여기 : http://wiki.debian.org/Multiarch

기본적으로 다양한 아키텍처 특정 라이브러리가 파일 시스템의 기존 위치에서 새로운 아키텍처 특정 위치로 이동되고 있습니다. 이것이 /usr/bin/ld혼란스러운 이유 입니다.

당신은 모두 crt1.o를 찾을 수 /usr/lib64//usr/lib/i386-linux-gnu/지금 당신은 그것에 대해 당신의 툴체인을 이야기해야합니다. 이를 수행하는 방법에 대한 몇 가지 문서가 있습니다. http://wiki.debian.org/Multiarch/LibraryPathOverview

단순히 심볼릭 링크를 생성하면 하나의 아키텍처 만 제공 되며 기본적으로 다중 아키텍처를 비활성화하게됩니다. 이것이 원하는 것일 수 있지만 최적의 솔루션이 아닐 수도 있습니다.


3
이것이 제가 처한 상황이기 때문에 "툴체인에 대해 알리는"방법에 대해 조금 더 자세히 설명하면 환상적 일 것입니다. 감사합니다.
SullX 2013-08-02

첫째, 구축하려는 아키텍처를 알아야합니다. AMD64 기반 애플리케이션을 구축하고 있습니까? 그렇다면 AMD64 기반 공유 객체 파일, 즉 필요한 .o 파일이있는 위치를 'ld'에 알려야합니다. AMD64에서 작업하는 경우에는 / usr / lib64에 있어야합니다
jeremiah

16

jeremiah가 게시 한 http://wiki.debian.org/Multiarch/LibraryPathOverview 를 읽은 후 심볼릭 링크없이 작동하는 gcc 플래그를 찾았습니다.

gcc -B/usr/lib/x86_64-linux-gnu hello.c

따라서 -B/usr/lib/x86_64-linux-gnuMakefile의 CFLAGS 변수에 추가 할 수 있습니다 .


@DjDac Ubuntu 16.04, AFAICT에서는 플래그가 필요하지 않습니다.
alexm

9

RHEL 7 64 비트를 사용하여 gcc 4.8 32 비트 프로그램을 컴파일하려면 두 가지 작업을 수행해야합니다.

  1. 모든 32 비트 gcc 4.8 개발 도구가 완전히 설치되었는지 확인합니다.

    sudo yum install glibc-devel.i686 libgcc.i686 libstdc++-devel.i686 ncurses-devel.i686
  2. -m32 플래그를 사용하여 프로그램 컴파일

    gcc pgm.c -m32 -o pgm

도난당한 곳 : 64 비트 RHEL에서 32 비트 앱을 컴파일하는 방법은 무엇입니까? -1 단계 만하면됩니다.


6

crti.o file missing 에서 설명했듯이 "gcc -print-search-dirs"를 사용하여 모든 검색 경로를 찾는 것이 좋습니다. 그런 다음 crt1.o의 위치를 ​​가리 키도록 위의 "sudo ln -s"에 설명 된대로 링크를 만듭니다.


3

이것은 Ubuntu 16.04에서 나를 위해 일했습니다.

$ LIBRARY_PATH=/usr/lib/x86_64-linux-gnu
$ export LIBRARY_PATH


1

CentOs 5.4에서 이것을 실행했습니다. lib64에는 crt * .o 파일이 포함되어 있지만 lib에는 포함되어 있지 않습니다. i386 비트를 설치 한 yum을 통해 glibc-devel을 설치하면 문제가 해결되었습니다.


0

i686-cm-linux-gcc를 크로스 컴파일 할 때도 동일한 컴파일 오류가 발생했습니다.

아래 컴파일 옵션이 내 문제를 해결했습니다.

$ i686-cm-linux-gcc a.c --sysroot=/opt/toolchain/i686-cm-linux-gcc

참고 : sysroot 는 usr / include를 사용할 수있는 컴파일러 디렉토리를 가리켜 야합니다.

제 경우에는 도구 체인이 / opt / toolchain / i686-cm-linux-gcc 디렉토리에 설치되어 있고 usr / include도 동일한 디렉토리에 있습니다.


0

다음과 같이 해결했습니다.

1) 다음을 사용하여 ctr1.o 및 ctri.o 파일을 찾습니다. find -name ctr1.o

내 컴퓨터에 다음이 있습니다. $/usr/lib/i386-linux/gnu

2) PATH(또한 LIBRARY_PATH) 환경 변수에 해당 경로를 추가하십시오 ( 이름이 무엇인지 확인 env하려면 터미널에 명령을 입력 하십시오) :

$PATH=/usr/lib/i386-linux/gnu:$PATH
$export PATH

혼동을 피하기 위해 $ PATH = / usr / lib / i386-linux / gnu : $ PATH $ export PATH 행은 실제로 다음과 같습니다.
pac88 2015-04-05

0

오늘도 같은 문제가 있었는데 권장 패키지를 설치하여 해결했습니다 : libc6-dev-mipsel-cross libc6-dev-mipsel-cross, libc-dev-mipsel-cross

이것은 작동했습니다.

sudo apt-get install libc6-dev-mipsel-cross

-1

제 경우에는 crti.o 오류가 Matlab의 실행 경로 구성에 수반되었습니다. 예를 들어 이전에 실행 디렉토리의 경로를 설정하지 않은 경우 파일을 수행 할 수 없습니다. 이를 수행하려면 : 파일> setPath, 디렉토리를 추가하고 저장하십시오.



-2

제 경우 Ubuntu 16.04에는 전혀 없습니다 crti.o.

$ find /usr/ -name crti*

그래서 개발자 libc 6 -dev 패키지를 설치 합니다.

sudo apt-get install libc6-dev
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.