.c 파일 없이 정적 라이브러리를 생성하는 것이 허용되지 않습니까?

StackOverflow https://stackoverflow.com//questions/11705324

  •  13-12-2019
  •  | 
  •  

문제

두 개의 파일이 있습니다 -> fact.h 그리고 main.c 에서 /home/snyp1/new 폴더. main.c 다음을 호출하는 주요 기능이 있습니다. fact(int x) 기능하다 fact.h.나는 .a ar 명령으로 아카이브 ->

snyp1@Snyp:~/new$ ar -r -s libfact.a fact.o
ar: creating libfact.a
fact.h  fact.o  libfact.a  main.c
snyp1@Snyp:~/new$ gcc main.c -L/home/snyp1/new -lfact -o main
/home/snyp1/new/libfact.a: could not read symbols: Archive has no index; run ranlib to add one
collect2: ld returned 1 exit status
snyp1@Snyp:~/new$ ranlib libfact.a
snyp1@Snyp:~/new$ gcc main.c -L/home/snyp1/new -lfact -o main
/home/snyp1/new/libfact.a: could not read symbols: Archive has no index; run ranlib to add one
collect2: ld returned 1 exit status

저는 우분투 12.04를 사용하고 있습니다.무엇이 문제인지 알려주세요.(또한, 이 기능을 사용하지 않으면 -L/.../new, gcc는 "lfact"를 찾을 수 없다고 말할 것입니다. 아마도 "lfact"가 없기 때문일 것입니다. /usr/local/lib)

편집하다:그렇군요 원인을 찾았습니다.내가 사용하고 있었기 때문이야 fact.h 구축하기 위해 fact.o 그런 다음 라이브러리에 넣으면 예상대로 작동하지 않았습니다.그래서 지금은 다음과 같이 바꿨습니다. file.c 지금은 잘 작동하고 있어요.해당 정보를 제공했어야 했는데 죄송합니다.왜 이런 문제가 발생해야하는지 모르겠습니다.최소한 하나도 없으면 라이브러리를 만들 수 없나요? .c 그 안에 파일을 넣어?

도움이 되었습니까?

해결책

나는 Fact.h를 사용하여 Fact.o를 구축한 다음 이를 라이브러리에 넣었는데 예상대로 작동하지 않았습니다.

컴파일 중이라는 뜻인가요? fact.h 생산하는 fact.o?

그렇다면 예상한 대로 작동하지 않는 것입니다.호출할 때 gcc 헤더 파일에서는 미리 컴파일된 헤더를 생성합니다. ~ 아니다 객체 파일.따라서 다음과 같은 파일이 있지만 foo.o 유효한 개체 파일이 아니었습니다.방금 달려갔더라면 gcc -c fact.h 미리 컴파일된 헤더를 생성했을 것입니다. fact.gch, 하지만 아마도 당신은 달렸을 것입니다 gcc -c fact.h -o fact.o 이로 인해 파일이 호출됩니다. fact.o 아직 미리 컴파일된 헤더임에도 불구하고요. file fact.o 다음과 같은 사실을 보여줬을 것입니다:

$ file fact.o
fact.o: GCC precompiled header (version 013) for C

다음을 실행하면 GCC가 파일을 헤더가 아닌 C 코드로 처리하도록 강제할 수 있습니다. gcc -x c -c fact.h -o fact.o (그만큼 -x c 파일 확장자에서 유형을 추론하는 대신 입력을 C 코드로 처리한다고 합니다. 그러나 헤더를 컴파일하는 대신 파일 이름을 올바르게 지정하는 것이 더 간단하고 덜 혼란스러울 것입니다.

적어도 하나의 .c 파일 없이 라이브러리를 만들 수 없나요?

최소한 하나의 개체 파일이 필요합니다(예: .o 파일) 그러나 유효한 개체가 없고 다음과 같이 잘못 명명된 미리 컴파일된 헤더가 있습니다. .o, 이지만 실제로는 개체 파일이 아니었습니다.

내가 사용하지 않으면 -L/.../new, gcc는 "lfact"를 찾을 수 없다고 말할 것입니다. 아마도 "lfact"가 없기 때문일 것입니다. /usr/local/lib

링커는 내부만 보는 것이 아니라 /usr/local/lib, 다른 기본 위치가 보이는데, 그렇습니다. 기본적으로 그게 문제입니다.다음과 같이 말할 수도 있습니다. -L. 라이브러리가 현재 디렉터리에 있으면 절대 경로를 제공하는 것보다 쉽습니다.

다른 팁

잘 모르겠어요 ar 첫 번째 옵션 이외의 항목에 대시를 지원합니다.노력하다

ar -rs libfact.a fact.o

아니면 그냥

ar rs libfact.a fact.o

명심하세요, 왜 달리는지 모르겠어요 ranlib 그래도 작동하지 않았습니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top