> 백엔드 개발 > C++ > 독특한 공유 라이브러리 문제

독특한 공유 라이브러리 문제

Patricia Arquette
풀어 주다: 2025-01-28 14:03:11
원래의
388명이 탐색했습니다.

Unique Shared Library Problem 도전 : 공유 라이브러리 연결

나는 최근에 소스 구축 라이브러리를 로컬 C 프로젝트에 통합하면서 링크 문제를 겪었습니다. 링커는 공유 라이브러리와 연결하려고 할 때 오류를보고했습니다. 아래에 표시된 것과 유사한 오류 메시지는 링커가 라이브러리 내에서 정의 된 기호를 찾을 수 없음을 나타냅니다.

문제 해결 단계 초기 문제 해결에는 다양한 방법을 사용하여 라이브러리를 여러 번 다시 만나는 데 성공했습니다. 연구를 통해 32 비트 대 64 비트 공구 체인과 관련된 유사한 문제를 설명하는 포럼 게시물로 이어졌습니다. 내 환경이 64 비트로 확인되었지만 이로 인해 컴파일러 자체를 고려해야합니다.

예상치 못한 솔루션 : 스위칭 컴파일러

나는 GCC에서 Clang으로 전환했고 편집 및 연결은 완벽하게 작동했습니다. 솔루션의 명백한 단순성과 과거 프로젝트에서 유사한 문제가 부족하다는 점을 감안할 때 이것은 놀라운 일이었습니다. undefined reference 통제 된 실험

추가 조사를 위해, 나는 간단한 테스트 사례를 만들었습니다 : 함수를 구현하는 공유 라이브러리, Clang과 함께 컴파일 된 드라이버 프로그램 ()을 사용하려고했습니다.
<code>/bin/ld: /tmp/ccHb7mJ8.o: in function `SDL_main':
main.c:(.text+0x3c): undefined reference to `SDL_EnterAppMainCallbacks'
... (other undefined references) ...
collect2: error: ld returned 1 exit status
make: *** [Makefile:7: all] Error 1</code>
로그인 후 복사

lib.h :

lib.c :

main.c :

build_so.sh (clang) :

libm.so add main.c build_main.sh (gcc) :

  • 이로 인해 원래 프로젝트와 동일한 오류가 발생했습니다. 그러나 스크립트가 Clang을 사용하도록 수정되면 문제가 해결되었습니다. 추가 실험은 컴파일러 역할 (라이브러리의 GCC, 메인 프로그램의 Clang)을 역전 시켰 으며이 조합이 올바르게 작동했습니다. 결론 : 컴파일러 비 호환성

    <code class="language-c">#pragma once
    int add(int a, int b);</code>
    로그인 후 복사
    조사에 따르면 명백한 비 호환성이 밝혀졌습니다. Clang 컴파일 된 공유 라이브러리에는 GCC와 연결될 때 문제가있는 것으로 보이며 역 시나리오는 문제없이 작동합니다. 이것은 일반적으로 프로젝트의 모든 부분에 동일한 컴파일러를 사용하기 때문에 이전 에이 문제를 겪지 않은 이유를 설명합니다. 이 비 호환성의 근본 원인은 불분명하지만 다른 컴파일러와 구축 된 라이브러리를 통합 할 때 잠재적 인 함정을 강조합니다. 누군가가 해결 방법을 알고 있다면, 나는 그것을 듣고 싶어합니다.

위 내용은 독특한 공유 라이브러리 문제의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
저자별 최신 기사
인기 튜토리얼
더>
최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿