2017-03-05 8 views
3

Apache 모듈을 C++로 작성하고 싶습니다. 사용 apxs로 컴파일Apache 모듈을 C++로 작성하려면 어떻게해야합니까?

#include "httpd.h" 
#include "http_core.h" 
#include "http_protocol.h" 
#include "http_request.h" 

static void register_hooks(apr_pool_t *pool); 
static int example_handler(request_rec *r); 

extern "C" module example_module; 

module AP_MODULE_DECLARE_DATA example_module = { 
    STANDARD20_MODULE_STUFF, NULL, NULL, NULL, NULL, NULL, register_hooks 
}; 

static void register_hooks(apr_pool_t *pool) { 
    ap_hook_handler(example_handler, NULL, NULL, APR_HOOK_LAST); 
} 

static int example_handler(request_rec *r) { 
    if (!r->handler || strcmp(r->handler, "example")) 
     return (DECLINED); 

    ap_set_content_type(r, "text/plain"); 
    ap_rputs("Hello, world!", r); 
    return OK; 
} 

잘 작동하는 것 같다 : 내가 아파치를 시작하려고하면

apxs -i -n example_module -c mod_example.cpp 

그러나, 나는 오류가 나는 시작하는 매우 베어 본 모듈을 시도했다. 좀 더 읽기 쉬운 줄 바꿈을 삽입했습니다.

httpd: Syntax error on line 56 of /etc/httpd/conf/httpd.conf: 
     Syntax error on line 1 of /etc/httpd/conf.modules.d/20-mod_example.conf: 
     Can't locate API module structure `example_module' in file /etc/httpd/modules/mod_example.so: 
     /etc/httpd/modules/mod_example.so: undefined symbol: example_module 

사실, 나는 mod_example.soexample_module를라는 이름의 기호가 없음을 objdump -t으로 확인할 수 있습니다. 내가 수동으로 (내가 libtoolapxs 내부에서 실행 볼 수있는 명령을 모방하는)

gcc -shared -fPIC -DPIC -o mod_example.so `pkg-config --cflags apr-1` -I/usr/include/httpd mod_example.cpp 

로 컴파일하는 경우, 다음 objdump -t 실제로 mod_example.soexample_module 기호를 표시 않기 때문에 나는이 특히 혼란을 찾을 수 있습니다.

무엇을 제공합니까? 내 .soexample_module이 표시되지 않는 이유는 무엇입니까? 문제를 해결하려면 어떻게해야합니까?

+0

cpp 파일을 오브젝트 파일로 컴파일 한 다음 오브젝트 파일을 apxs 도구로 전달하는 방법은 무엇입니까? – Ankur

+0

@Ankur 환상적입니다, 제안에 감사드립니다! 당신이 대답으로 대답한다면, 나는 그것을 받아 들일 것이다. 그렇지 않으면 받아 들일 하루 이틀 안에 나 자신을 씁니다. –

+0

Daniel이 @ Ankur의 제안 작업을 했습니까? 그렇다면, 어느 쪽이든 그렇게하는 방법에 대한 메모를 추가하십시오. 저와 당신의 흔적을 따라가는 다른 사람들을 도울 수 있습니다. 고맙습니다. – JulianHarty

답변

2

이 문제를 해결하는 한 가지 방법은 cpp 파일을 오브젝트 파일로 컴파일 한 다음 해당 오브젝트 파일을 apxs 도구로 전달하는 것입니다. 예 :

g++ `pkg-config --cflags apr-1` -fPIC -DPIC -c mod_example.cpp 
apxs -i -n example_module `pkg-config --libs apr-1` -c mod_example.o 
+0

고맙습니다. – JulianHarty