2

私はApacheでC++モジュールを書きました。以下はコードです::

mod_foo.hpp

#ifndef MOD_FOO_HPP
#define MOD_FOO_HPP
#ifdef __cplusplus
#define EXTERN_C_BLOCK_BEGIN    extern "C" {
#define EXTERN_C_BLOCK_END      }
#define EXTERN_C_FUNC           extern "C"
#else
#define EXTERN_C_BLOCK_BEGIN
#define EXTERN_C_BLOCK_END
#define EXTERN_C_FUNC
#endif
#include <httpd.h>
#include <http_protocol.h>
#include <http_config.h>**
#endif  /* MOD_FOO_HPP */

mod_foo.c

#include "mod_foo.hpp"

EXTERN_C_FUNC
int foo_handler( request_rec* inpRequest )
{
    int nReturnVal = DECLINED;

    if ( inpRequest->handler != NULL && strcmp( inpRequest->handler, "foo" ) == 0 )
    {
        ap_rputs( "Hello World from FOO", inpRequest );
        nReturnVal = OK;
    }

    return nReturnVal;
}

EXTERN_C_FUNC
void foo_hooks( apr_pool_t* inpPool )
{
    ap_hook_handler( foo_handler, NULL, NULL, APR_HOOK_MIDDLE );
}

EXTERN_C_BLOCK_BEGIN
module AP_MODULE_DECLARE_DATA foo_module =
{
    STANDARD20_MODULE_STUFF,
    NULL,
    NULL,
    NULL,
    NULL,
    NULL,
    foo_hooks
};
EXTERN_C_BLOCK_END

モジュールは正常にコンパイルされ、Apache サーバーにもインストールされますが、インストール後に Apache サーバーを再起動すると、次のエラーが発生します。

apache2: /etc/apache2/apache2.conf の 234 行目の構文エラー: /etc/apache2/conf.d/foo.conf の 1 行目の構文エラー: ファイル /usr/lib/apache2 の API モジュール構造 'foo_module' /modules/mod_foo.so が文字化けしています - 予想される署名は 41503232 ですが、41503234 が表示されました - おそらくこれは Apache モジュール DSO ではないか、別の Apache バージョン用にコンパイルされたのでしょうか?

モジュールをロードするために追加しましたが、このエラーが発生するのは C++ モジュールだけですLoadModulehttpd.confこの問題を解決する方法について何か考えはありますか?

4

1 に答える 1

0

ハンドラーは静的として宣言する必要があると思います。これにより、モジュールの前にプレフィックス extern "C" を追加する必要があることに加えて、エラーが発生する可能性がありますが、extern "C" プレフィックスを持つすべての関数を追加する必要はありません。

于 2013-05-15T09:40:46.927 に答える