질문을 삭제하지 말아주세요.!
 
2
1
0

PHP C 모듈이 필요해서 대충 찾아보면서 만들고 있는데요,

config.m4 파일과 php_helloworld.c 파일만 가지고 만들고 있습니다.

다른대서 만들어진 a.so 파일이 있고 이 파일에 대한 a.h 파일을 제공받았습니다.

그래서 이 녀석 두개를 이용해서 다시 php extension으로 만드려고 합니다.

 

 

config.m4 파일은 다음과 같이 작성하였고요,

PHP_ARG_ENABLE(helloworld, whether to enable my extension,
[ --enable-helloworld   Enable php-helloworld])
 
if test "$PHP_TENSORFLOW" = "yes"; then

  AC_DEFINE(HAVE_TENSORFLOW, 1, [Whether you have phphelloworld])
  PHP_ADD_INCLUDE(lib/a)
  PHP_NEW_EXTENSION(helloworld, php_helloworld.c, $ext_shared)
fi

 

그리고 php_helloworld.c 파일에는

 

#include "a.h" 

이런식으로 넣어서 빌드하니까 빌드는 됩니다. 그런데 a.so 와 연결하지 않아서 실행할때 링크 에러가 출력됩니다.

혹시 config.m4 에 어떻게 옵션을 설정해야 Makefile 생성할때 해당 링크 옵션이 나올까요?

    CommentAdd your comment...

    3 answers

    1.  
      2
      1
      0

      아니면 PHP-CPP 를 사용하면 모듈을 좀 더 쉽게 만들수 있습니다.

       

      tensorflow 가 C++ 이므로 매핑도 쉬울 것 같은데 제가 예전에 libsass 바인딩할 때 대충 정리한 문서가 혹시 도움이 될지 모르겠네요.

      1. 완두

        헛.. 저 뭐하는지 어떻게 아셨죠... 

         

        https://www.tensorflow.org/versions/r0.12/how_tos/language_bindings/index.html

         

        이런 문서를 보니 c_api.h 파일을 제공해준다고 하는데, 왠지 C로 해야할 것 같은 강박관념이 생기더라고요. 안그래도 광섭님께서 첨부해주신 페이지 꼼꼼히 잘 읽었습니다. ㅎㅎ 항상 감사드립니다.

      CommentAdd your comment...
    2.  
      2
      1
      0

      shared object(.so)는 종속버전을 지정하지 않는 것을 권장합니다. 

      쉽게 이야기 해서, so가 다른 so를 본다면, 시스템에 이미 설치되어있는 것을 그대로 사용할 것을 권장하고, 이를 배포할 때, 포함하는 것이 아니라 동작을 위해 필요한 환경으로 명시되어야 한다는 것입니다.

      만약 특정 라이브러리를 빌드하고 가져다 쓰는 라이브러리를 만들 경우에는 archive( .a ) 로 만들어서 링크해서 포함/배포 합니다.

       

      이건 그냥 일반적으로 그렇다는 거구요. 말씀하신 내용은 아래 링크를 참고해 보심 좋겠네요.

      http://stackoverflow.com/questions/19424494/linking-a-shared-library-with-another-shared-lib-in-linux

       

      http://stackoverflow.com/questions/29609438/php-linking-to-a-shared-library-in-an-extension

       

       

      1. 완두

        꺅!! 감사합니다!! 왜 제가 검색할땐 저런 글을 찾지 못했을까요... 역시 검색도 내공이 쌓여야... 

      2. taelkim

        .so가 shared object, .a 가 archive 라는걸 알면 ... ^^

        근데, 말씀하신거처럼 하는것 보단 배포 시점에 .so 를 두개로 (참조하는것 포함) 배포하는 것을 권장합니다.

        그리고, LIBRARY 경로 관련해서는, 특정 모듈에서 추가 라이브러리 경로를 포함하는 것 보다는, 

        시스템의 기본 라이브러리 위치에 내 라이브러리를 집어넣는것(=인스톨)을 권장합니다.

        넣지 못하는 상황이라면, LD_LIBRARY_PATH 에 추가해서 시스템의 모든 프로그램이 참조할 수 있도록 하는 것이 일반적입니다. (베스트인지는 모르겠네요)

        예를들어 아래 정광섭님이 예로 들어주신 oci 어쩌고 오라클의 경우가 그렇습니다.

         

      CommentAdd your comment...
    3.  
      2
      1
      0

      PHP_ADD_LIBPATH(lib/a) 를 넣어주면 되지 않을까요.

       

      참 라이브러리 이름은 liba.so 처럼 앞에 lib 이 붙어야 할겁니다.

      1. 완두

        이런 방법도 있었군요!! 감사합니다! 네 맞아요, 실제로 라이브러리 파일명이 liba.so 처럼 앞에 lib가 붙어있어요!

      2. 정광섭

        아 오타를 냈네요. PHP_ADD_LIBRARY 에 라이브러리 이름을 지정해 주고

        PHP_ADD_LIBPATH에는 라이브러리 경로를 지정해 주면 될겁니다.
        (PHP_ADD_LIBPATH 는 /usr/lib 에 설치되지 않았을 경우에만 해줬던거 같기도 한대요..)

         

        다음은 오라클 라이브러리인 oci 의 config.m4 인데 오라클의 dynamic library 도 /usr/lib 에 설치되지 않으므로 아래와 같이 강제로 지정해 주더군요.

        PHP_ADD_LIBRARY(clntsh, 1, OCI8_SHARED_LIBADD)
        PHP_ADD_LIBPATH($OCI8_DIR/$OCI8_LIB_DIR, OCI8_SHARED_LIBADD)

        오라클의 동적 라이브러리 이름이 libclntsh.so 이며 $OCI8_DIR 은 configure 실행시 ORACLE_HOME 변수를 참고해서 자동 설정됩니다.

         

        PHP_ADD_LIBRARY 의 2, 3번째 파라미터는 제외해도 될 듯 합니다.

        (다 가정형으로 쓴 것처럼 해보고 안 되면 또 알려주세요.~)

      CommentAdd your comment...