programing

정의되지 않은 참조 'shm_open', 이미 여기에 -lrt 플래그를 추가했습니다.

padding 2023. 6. 27. 21:50
반응형

정의되지 않은 참조 'shm_open', 이미 여기에 -lrt 플래그를 추가했습니다.

방금 시스템 충돌이 발생하여 Ubuntu 11.10을 다시 설치했는데 코드가 이 이상한 오류를 생성합니다.

문제가 어디에 있는지 테스트하기 위해 간단한 코드 샘플을 작성했습니다.

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <fcntl.h>
#include <sys/mman.h>
#include <sys/stat.h>

int main (void) {

    int i;

    i = shm_open ("/tmp/shared", O_CREAT | O_EXCL, S_IRUSR | S_IWUSR);   printf ("shm_open rc = %d\n", i);

    shm_unlink ("/tmp/shared");

    return (0);
}

그리고 컴파일 명령은

gcc -lrt test.c -o test

오류:

/tmp/ccxVIUiP.o: In function `main':
test.c:(.text+0x21): undefined reference to `shm_open'
test.c:(.text+0x46): undefined reference to `shm_unlink'
collect2: ld returned 1 exit status

나는 이미 -lrt lib를 추가했는데, 왜 아직도 컴파일이 안 되나요?

끝에 있는 라이브러리:

gcc test.c -o test -lrt

GCC 링크 옵션에서:

-도서관-l 라이브러리링크할 때 라이브러리 이름이 지정된 라이브러리를 검색합니다. 
(도서관을 별개의 주장으로 하는 두 번째 대안.는 POSIX 준수만을 위한 것이며 권장되지 않습니다.)

명령에서 이 옵션을 쓰는 위치가 다릅니다.링커는 라이브러리와 객체 파일을 검색하고 처리합니다.순서를 지정합니다.
따라서 'foo.o -lz bar.o'는 foo.o 파일 뒤에 있는 'z' 라이브러리를 검색하지만,변호사 앞에서만약 bar.o가 'z'의 함수들을 가리킨다면, 그 함수들은로드되지 않을 수 있습니다.

컴파일 행 변경 위치

gcc -lrt test.c -o test

로.

gcc test.c -o test -lrt

Expert C programming108페이지:<Handy Heuristic> Where to Put Library Options:Always put the -l library options at the rightmost end of your compilation command line.하지만 이유를 알 수는 없습니다. 그래서 저는 이것이 다소 규칙이라고 생각합니다.:)

저처럼 슈퍼 오토매직 CMAKE를 사용하는 분들은 다음을 추가해 보십시오.

target_link_libraries(your_binary_name PRIVATE librt.so)

CmakeLists로 이동합니다.txt

또는 필요에 따라 Public(공용)용 Private(개인)를 교체합니다.


라이브러리에 대한 경로(예: /usr/lib에 필요한 모든 lib)가 잘 설정되어 있는 경우에는 CmakeLists에 기술하는 것만으로도 괜찮을 수 있습니다.txt:

set(CMAKE_CXX_FLAGS "-lrt")

언급URL : https://stackoverflow.com/questions/9923495/undefined-reference-shm-open-already-add-lrt-flag-here

반응형