정의되지 않은 참조 '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 programming
108페이지:<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
'programing' 카테고리의 다른 글
데이터 테이블에서 빈 행을 제거하는 방법 (0) | 2023.06.27 |
---|---|
Dapper Dot Net을 사용하여 데이터베이스 결과에서 사전 개체에 매핑하는 방법은 무엇입니까? (0) | 2023.06.27 |
axios 시간 초과 후 알림 받기 (0) | 2023.06.27 |
MongoDB 및 PostgreSQL 생각 (0) | 2023.06.27 |
트리와 같은 방식으로 Git branch (0) | 2023.06.27 |