Как я могу написать модуль Apache на C ++?

Я хотел бы написать модуль 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 кажется, работает просто отлично, используя:

apxs -i -n example_module -c mod_example.cpp

Однако, когда я пытаюсь запустить httpd, я получаю сообщение об ошибке. Я вставил несколько новых строк, чтобы сделать их более разборчивыми.

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

Действительно, я могу подтвердить с objdump -t что нет символа с именем example_module в mod_example.so, Я нахожу это особенно запутанным, потому что, если я вручную скомпилирую

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

(который имитирует команду, которую я вижу libtool работает изнутри apxs), затем objdump -t действительно показывает example_module символ в mod_example.so,

Что дает? Почему не example_module появляются в моем .so? Что я могу сделать, чтобы это исправить?

3

Решение

Одним из подходов к решению этой проблемы было бы скомпилировать файл 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
2

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]