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 기호가 발견되지 않았 음을 의미합니다.
동적 라이브러리 누락 대상 기호 <br> 호출하려는 C 함수는 동적 라이브러리에 컴파일되지 않았거나 컴파일러 (C ++의 이름 수정)에 의해 이름을 다시 작성합니다.
동적 라이브러리 의존성로드되지 않음 <br> 호출 된 동적 라이브러리는 다른 동적 라이브러리에 의존하며 이러한 종속성은 올바르게로드되지 않았거나 경로 오류가 없습니다.
기호 이름 쓰기 오류 <br> 기호 이름은 .ffi 선언 파일 또는 FFI 호출 코드에서 잘못된 철자입니다.
동적 라이브러리 경로 오류 또는 버전 불일치 <br> 로드 된 동적 라이브러리 버전 및 코드 기대치는 일관성이 없으므로 기호가 누락됩니다.
플랫폼 차이 및 컴파일 옵션 <br> 예를 들어, Linux 및 Windows에서는 기호 내보내기 메소드가 다르므로 기호를 찾을 수 없습니다.
UNIX와 같은 시스템에서 NM 명령을 사용하여 동적 라이브러리에 지정된 기호가 포함되어 있는지 확인할 수 있습니다.
nm -D /path/to/libexample.so | grep my_function
출력이 없으면 기호가 존재하지 않습니다.
출력이 있지만 밑줄 또는 이름 수정이있는 경우 C ++ 이름 수정 문제 일 수 있습니다.
동적 라이브러리에 의존하는 다른 라이브러리가 누락되었는지 확인하십시오.
ldd /path/to/libexample.so
의존성이 없는지 확인하십시오. 종속성의 부족으로 인해 심볼이 해결되지 않을 수 있습니다.
선언 된 함수 이름, 매개 변수 유형 및 반환 값이 올바른지 확인하고 동적 라이브러리의 기호에 하나씩 일치해야합니다.
함수가 포함 된 동적 라이브러리 libmath. 가 있다고 가정합니다.
// math.h
int add(int a, int b);
// math.ffi
int add(int a, int b);
<?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 동적 라이브러리 기능을 성공적으로 호출 할 수 있습니다.