2015-01-29 1 views
0

리눅스 프로젝트를 리눅스로 포팅하는 중입니다. 리눅스 (우분투)에서 빌드 파이프 라인을 배우고 설정하려고합니다. 나는 창문에 clang을 사용하고 우분투에서 코드를 컴파일하기 위해 clang/llvm을 사용하고 싶지만 c 런타임 라이브러리를 내 코드에 연결하는 데 문제가 있습니다. 여기에 내가 터미널에서 위의 코드뿐만 아니라, 플랫폼에 의존하는 코드를 실행 우분투 14.04 LTS를 연타 3.4을 설치 한 후리눅스에서 clang을 C++로 사용할 때 표준 crt를 연결하는 데 문제가 있습니다.

// -- system includes 
#include <stdio.h> 
#include <stdlib.h> 
#include <string.h> 

// -- my includes 
#include "crt.h" 

int main() { 
char title[] = "Text"; 
int title_length = strlen(title); 

// -- sending string and length to platform dependent code 
CreateBox(title, title_length); 

return(0); } 

, 난 그냥 내가 빌드 스크립트를 설정할 수 있습니다 실행하려고하고있는 무슨의 예,

clang++ -c main.cpp box_linux.cpp 

파일을 오류없이 컴파일합니다. ,

ld main.o box.o 

나는 다음과 같은 오류를 매번 다시 얻을의 내가 연결하려고 할 때 나는 다음과 같은 명령을 사용했다라고 나는의 libC++, 된 libstdC++하지만 아무것도 작동하는 것 같다없는 연결 시도

ld: warning: cannot find entry symbol _start; defaulting to 00000000004000b0 
In function 'main': 
(.text+0x30): undefined reference to 'strlen' 

하자. 나는 매우 신빙성이있다. 매우 리눅스에 익숙하지 않고 리눅스에 clang하기 때문에 나는 사전에 사과한다. stackoverflow뿐만 아니라 Ubuntu의 포럼과 LLVM의 포럼/docs에서 다른 질문을 확인했습니다. 누군가가 올바른 방향으로 나를 가리킬 수 있다면 크게 감사하겠습니다.

답변

3

리눅스에서 clang (또는 gcc)을 사용하는 경우 직접 링크하지 않아도됩니다. clang이 당신을 위해 연결을하도록 할 수 있으며 귀하의 시스템에 필요한 라이브러리를 선택하게됩니다. -c 플래그 양식 명령 줄을 제거하거나 clang main.o을 사용하십시오. Clang은 .o 파일이 이미 객체 파일이며이를 링커에 전달 함을 알고 있습니다.

실제로 ld을 직접 호출하려면 clang++ -v main.cpp으로 시작하십시오. 내 우분투 14.04 LTS에

/usr/bin/ld" -z relro --hash-style=gnu --build-id --eh-frame-hdr -m elf_x86_64 -dynamic-linker /lib64/ld-linux-x86-64.so.2 -o a.out /usr/lib/gcc/x86_64-linux-gnu/4.8/../../../x86_64-linux-gnu/crt1.o /usr/lib/gcc/x86_64-linux-gnu/4.8/../../../x86_64-linux-gnu/crti.o /usr/lib/gcc/x86_64-linux-gnu/4.8/crtbegin.o -L/usr/lib/gcc/x86_64-linux-gnu/4.8 -L/usr/lib/gcc/x86_64-linux-gnu/4.8/../../../x86_64-linux-gnu -L/lib/x86_64-linux-gnu -L/lib/../lib64 -L/usr/lib/x86_64-linux-gnu -L/usr/lib/gcc/x86_64-linux-gnu/4.8/../../.. -L/data/home/user/bin/../lib -L/lib -L/usr/lib /tmp/test-574b88.o -lstdc++ -lm -lgcc_s -lgcc -lc -lgcc_s -lgcc /usr/lib/gcc/x86_64-linux-gnu/4.8/crtend.o /usr/lib/gcc/x86_64-linux-gnu/4.8/../../../x86_64-linux-gnu/crtn.o 

다음 -v 스위치는 그 소리를 인쇄, 예를 들어, 다음과 같습니다 ld의 호출 명령을 할 수 있습니다.

+0

빠른 응답을 보내 주셔서 감사합니다. 그리고 나는 그것에 추가 파일이나 적어도 언급을 포함 시켰어야했다. 그건 내 실수 였어. 내 코드 플랫폼을 독립적으로 만들려고하기 때문에 플랫폼 독립적 인 모든 기능 (I/O, 그래픽 등)을 처리하는 공통 파일을 호출하는 엔트리 포인트가 있습니다. 내가 아는 한, clang과 gcc는 하나의 파일에 대해 자동으로 링크되지만 여러 파일에 대해 수행해야합니다. -v 옵션을 사용해 보았지만 '/tmp/string-48040e.o : No such file or directory'를 찾을 수 없다는 오류가 발생했습니다. –

+0

@EditedContent 당신이하고자하는 것을 반영하기 위해 질문을 편집하십시오. –

+0

"clang -o prog main.o file1.o file2.o ..."와 같은 것을 사용하십시오. –

관련 문제