>백엔드 개발 >PHP 튜토리얼 >PHP를 사용하여 so 라이브러리 파일의 코드를 호출합니다.

PHP를 사용하여 so 라이브러리 파일의 코드를 호출합니다.

不言
不言원래의
2018-04-09 10:04:157423검색

이 글에서 공유한 내용은 PHP를 사용하여 so 라이브러리 파일의 코드를 호출하는 것입니다. 특정 참조 값이 있습니다. 필요한 친구는 이를 참조할 수 있습니다.

so 파일에 특정 함수가 컴파일되어 있는데 php를 통해 어떻게 호출하나요? 한 가지 방법은 php 모듈(php 확장)을 작성하고, php에서 모듈에 있는 함수를 호출한 다음 모듈을 사용하여 에 있는 함수를 호출하는 것입니다. 다음은 Fedora Core 6을 운영 체제로 사용하는 간단한 예입니다.

먼저 간단한 so 파일을 만듭니다:

1  /**
 2   * hello.c
 3   * To compile, use following commands:
 4   *   gcc -O -c -fPIC -o hello.o hello.c 
 5   *   gcc -shared -o libhello.so hello.o
 6   */
 7  
 8  int hello_add(int a, int b)
 9  {
10      return a + b;
11  }

그런 다음 .so 파일로 컴파일하고 시스템에 넣습니다:

1 ___FCKpd___1nbsp;gcc -O -c -fPIC -o hello.o hello.c
2 ___FCKpd___1nbsp;gcc -shared -o libhello.so hello.o
3 ___FCKpd___1nbsp;su
4 # echo /usr/local/lib > /etc/ld.so.conf.d/local.conf
5 # cp libhello.so /usr/local/lib
6 # /sbin/ldconfig

정확성을 확인하기 위한 작은 프로그램 작성:

 1/**
 2  * hellotest.c
 3  * To compile, use following commands:
 4  *   gcc -o hellotest -lhello hellotest.c
 5  */
 6 #include <stdio.h>
 7 int main()
 8 {
 9     int a = 3, b = 4;
10     printf("%d + %d = %d/n", a, b, hello_add(a,b));
11     return 0;
12 }

컴파일 및 실행:

 $ gcc -o hellotest -lhello hellotest.c
$ ./hellotest
3 + 4 = 7

좋아, PHP 모듈을 만들어보자. 먼저 php-devel 패키지를 설치했는지 확인하세요. 그렇지 않은 경우 설치 CD에서 찾으세요. 그런 다음 PHP 소스 코드를 다운로드하십시오. 저는 압축이 풀린 php-5.2.3.tar.gz를 사용하고 있습니다.

 $ tar xzvf php-5.2.3.tar.gz
$ cd php-5.2.3/ext

그런 다음 다음 명령을 통해 hello라는 모듈을 만듭니다.

 $ ./ext_skel --extname=hello

이 명령을 실행하면 모듈을 컴파일하는 데 어떤 명령을 사용해야 하는지 묻는 메시지가 표시됩니다. 안타깝게도 이는 모듈을 PHP에 통합하는 컴파일 방법입니다. 동적으로 로드 가능한 php_hello.so로 컴파일하려는 경우 방법이 더 간단합니다.

 $ cd hello

먼저 config.m4 파일을 편집하고 16행과 18행의 주석을 제거합니다(주석 기호는 dnl입니다.)

1 16:  PHP_ARG_ENABLE(hello, whether to enable hello support,
2 17:  dnl Make sure that the comment is aligned:
3 18:  [  --enable-hello           Enable hello support])

그런 다음 phpize 프로그램을 실행하여 구성 스크립트를 생성합니다:

 $ phpize

그런 다음 php_hello.h를 엽니다. PHP_FUNCTION(confirm_hello_compiled); 아래에 함수 선언을 추가합니다.

1PHP_FUNCTION(confirm_hello_compiled);   /* For testing, remove later. */
2 PHP_FUNCTION(hello_add);

hello.c를 열고 PHP_FE(confirm_hello_compiled, NULL) 아래에 다음 내용을 추가합니다.

<br/>

그런 다음 hello.c 끝에 hello_add 함수의 내용을 작성합니다.

 1PHP_FUNCTION(hello_add)
 2 {
 3     long int a, b;
 4     long int result;
 5 
 6     if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "ll", &a, &b) == FAILURE) {
 7         return;
 8     }
 9 
10     result = hello_add(a, b);
11 
12     RETURN_LONG(result);
13 }

저장 및 종료, 컴파일 및 설치:

___FCKpd___12nbsp;./configure
 ___FCKpd___12nbsp;make LDFLAGS=-lhello
 ___FCKpd___12nbsp;su
 # cp modules/hello.so /usr/lib/php/modules

그런 다음 /var/www/html 아래에 다음 내용으로 hello.php 파일을 만듭니다. :

 <?php
dl("hello.so");
echo hello_add(3, 4);
?>

그런 다음 브라우저에서 hello.php 파일을 엽니다. 7이 표시되면 함수 호출이 성공한 것입니다.

리눅스 지식보충:

에디트플러스를 사용하다보니 기본 C언어 소스프로그램이 .cpp로 저장되어 있다가 cygwin에서 gcc로 컴파일하다보니 항상 일부 기능이 선언되지 않은 상태로 나오네요. 표준 시스템에 전화하세요. 왜요?


저는 이 문제 때문에 오후와 밤 내내 우울했습니다. 나중에 왜 소스 프로그램 .cpp를 .c로 변경하라는 요청을 받았는지 알 수 없었고 컴파일은 순조롭게 진행되었습니다.

나중에 나는 Linux에서 gcc가 .c 파일을 컴파일하는 데 사용되는 반면, C++ 파일은 c++ 소스 프로그램을 컴파일하려면 g++ 명령이 필요하다는 것을 인터넷에서 배웠습니다.

관련 권장사항:

PHP를 사용하여 방문자 IP, 지역 위치, 브라우저 및 소스 페이지 정보 얻기

PHPstorm을 사용한 PHP의 자동 프롬프트 기능에 대한 자세한 설명

위 내용은 PHP를 사용하여 so 라이브러리 파일의 코드를 호출합니다.의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.