현재 위치: > 최신 기사 목록> ffi ::로드가 정의되지 않은 기호 오류를보고하는 이유는 무엇입니까? 신속하게 찾아서 수리하는 방법

ffi ::로드가 정의되지 않은 기호 오류를보고하는 이유는 무엇입니까? 신속하게 찾아서 수리하는 방법

gitbox 2025-06-09

PHP 7.4 이상에서 FFI (FORONE FUNTION Interface)는 개발자에게 C Lange Dynamic Libraries를 호출하는 강력한 기능을 제공합니다. 그러나 ffi ::로드 메소드를 사용하여 .ffi 파일을로드하거나 동적 라이브러리를 직접로드 할 때는 종종 정의되지 않은 심볼 오류가 발생하여 많은 개발자를 혼동합니다.

이 기사는이 오류의 원인을 깊이 분석하고 문제를 신속하게 찾는 방법을 소개하며 효과적인 솔루션을 제공합니다.


정의되지 않은 심볼 오류 란 무엇입니까?

정의되지 않은 기호 오류는 동적 링크 라이브러리를로드 할 때 일반적인 문제로, 런타임에서 기호 (함수, 변수, 상수 등)를 찾을 수 없음을 나타냅니다. 이 오류는 링크 된 동적 라이브러리에 일부 기호가 없거나 FFI를 사용하여 C 함수를 호출 할 때 기호 이름이 일치하지 않는 경우 발생합니다.

예를 들어 오류 메시지는 다음과 같습니다.

 PHP Warning:  FFI::load(): Unable to load dynamic library or symbol: undefined symbol: my_function

이것은 동적 라이브러리에서 My_function 기호가 발견되지 않았 음을 의미합니다.


정의되지 않은 심볼 오류의 일반적인 원인

  1. 동적 라이브러리 누락 대상 기호 <br> 호출하려는 C 함수는 동적 라이브러리에 컴파일되지 않았거나 컴파일러 (C ++의 이름 수정)에 의해 이름을 다시 작성합니다.

  2. 동적 라이브러리 의존성로드되지 않음 <br> 호출 된 동적 라이브러리는 다른 동적 라이브러리에 의존하며 이러한 종속성은 올바르게로드되지 않았거나 경로 오류가 없습니다.

  3. 기호 이름 쓰기 오류 <br> 기호 이름은 .ffi 선언 파일 또는 FFI 호출 코드에서 잘못된 철자입니다.

  4. 동적 라이브러리 경로 오류 또는 버전 불일치 <br> 로드 된 동적 라이브러리 버전 및 코드 기대치는 일관성이 없으므로 기호가 누락됩니다.

  5. 플랫폼 차이 및 컴파일 옵션 <br> 예를 들어, Linux 및 Windows에서는 기호 내보내기 메소드가 다르므로 기호를 찾을 수 없습니다.


문제를 신속하게 찾는 방법은 무엇입니까?

1. NM 도구를 사용하여 기호를 확인하십시오

UNIX와 같은 시스템에서 NM 명령을 사용하여 동적 라이브러리에 지정된 기호가 포함되어 있는지 확인할 수 있습니다.

 nm -D /path/to/libexample.so | grep my_function
  • 출력이 없으면 기호가 존재하지 않습니다.

  • 출력이 있지만 밑줄 또는 이름 수정이있는 경우 C ++ 이름 수정 문제 일 수 있습니다.

2. LDD를 사용하여 종속성을 확인하십시오

동적 라이브러리에 의존하는 다른 라이브러리가 누락되었는지 확인하십시오.

 ldd /path/to/libexample.so

의존성이 없는지 확인하십시오. 종속성의 부족으로 인해 심볼이 해결되지 않을 수 있습니다.

3. .ffi 선언을 확인하고 코드를 호출하십시오

선언 된 함수 이름, 매개 변수 유형 및 반환 값이 올바른지 확인하고 동적 라이브러리의 기호에 하나씩 일치해야합니다.


솔루션 예제

함수가 포함 된 동적 라이브러리 libmath. 가 있다고 가정합니다.

 // math.h
int add(int a, int b);

1. .ffi 선언 파일을 작성하십시오

 // math.ffi
int add(int a, int b);

2. PHP 코드 호출

 <?php
// 선언 파일을로드하고 동적 라이브러리를 연결하십시오
$ffi = FFI::cdef(
    file_get_contents('math.ffi'),
    "gitbox.net/libs/libmath.so"
);

$result = $ffi->add(3, 4);
echo "3 + 4 = $result\n";

URL의 도메인 이름은 gitbox.net 으로 대체됩니다.


정의되지 않은 기호가 여전히보고 된 경우 시도해보십시오.

  • 동적 라이브러리 내보내기 기호 확인 : NM 또는 OBJDUMP를 사용하여 ADD가 라이브러리에 포함되어 있는지 확인하십시오.

  • 동적 라이브러리 로딩 경로 확인 : 경로가 올바른지 확인하고 파일이 존재하며 권한이 정확합니다.

  • C ++ 이름 수정 확인 : 라이브러리가 C ++ 인 경우 Extern "C"를 사용하여 내보내기 기능을 수정하여 이름이 변경되지 않습니다.

  • 종속성 라이브러리로드 : 종속성 라이브러리가있는 경우 종속성 라이브러리를 먼저로드하거나 환경 변수 LD_LIBRARY_PATH를 설정하십시오.


요약

정의되지 않은 기호 오류는 주로 동적 라이브러리에서 기호를 찾을 수 없거나로드하지 못한 사실에 의해 발생합니다. 문제를 배치하는 열쇠는 다음과 같습니다.

  • 시스템 도구를 사용하여 동적 라이브러리 기호 및 종속성을 확인하십시오.

  • 선언 및 코드 기호 이름이 정확히 일치하는지 확인하십시오.

  • 동적 라이브러리가 상징을 올바르게 컴파일하고 내보내십시오.

  • 플랫폼 차이 및 환경 구성에주의하십시오.

이러한 방법을 통해 FFI ::로드 에 의해보고 된 정의되지 않은 기호 오류를 신속하게 찾아 고정하고 C 동적 라이브러리 기능을 성공적으로 호출 할 수 있습니다.