0

モジュールをLinuxApache2.4に移動しようとしていますが、リンクの問題が発生しています。Windowsでは、libhttpd.libとapr/apr-utilライブラリをリンクできます。lib * httpd aprとaprutilは、すべて私のWindowsインストールで静的にリンクされています。Linuxのインストールでも同じことをしたいと思います。

入手可能な限られたドキュメントによると、私のモジュールはC ++で書かれているため、APXSを使用できません。

Linuxでサーバーのアーカイブファイルを見つけるのに問題があります。モジュールを機能させるには、何に対してリンクする必要がありますか?

ソースは、Windowsホストでリンクして実行できます。

サンプルエラー:

    /home/ec2-user/httpd-2.4.2/srclib/apr/locks/unix/proc_mutex.c:367: undefined reference to `pthread_mutexattr_init'
    /home/ec2-user/httpd-2.4.2/srclib/apr/locks/unix/proc_mutex.c:374: undefined reference to `pthread_mutexattr_setpshared'
    /home/ec2-user/httpd-2.4.2/srclib/apr/locks/unix/proc_mutex.c:384: undefined reference to `pthread_mutexattr_setrobust_np'
    /home/ec2-user/httpd-2.4.2/srclib/apr/locks/unix/proc_mutex.c:393: undefined reference to `pthread_mutexattr_setprotocol'
    /home/ec2-user/httpd-2.4.2/srclib/apr/locks/unix/proc_mutex.c:414: undefined reference to `pthread_mutexattr_destroy'
    /home/ec2-user/httpd-2.4.2/srclib/apr/locks/unix/proc_mutex.c:408: undefined reference to `pthread_mutexattr_destroy'

ありがとう

4

3 に答える 3

1

したがって、これを検索している他の人が答えを得る可能性があります。

  1. Apache httpdサイトからホームディレクトリにApacheバージョン(2.2以降)のソースをダウンロードします
  2. 開梱
  3. すべてを使用して構成するか、オプションを指定しないでください(実際のビルド用に後で再構成できます)
  4. ソースでmakeを実行します(make installはまだ実行しないでください!オブジェクトファイルが必要です)
  5. ライブラリと独自のモジュールのソースを保持するディレクトリを作成します。ホームディレクトリ(または任意のディレクトリ)のトップレベルで「foo」と言います
  6. ホームディレクトリを想定:execute(find〜/ httpdX.X -name'* .o' -exec cp {}〜/ foo \;)コマンドは括弧内にあります。これにより、コンパイルされたすべてのオブジェクトがfooにコピーされます。
  7. 実行(find〜/ foo -name'* .o' -exec ar r libhttpd.a {} \;)これにより、コードのアーカイブが作成されます。
  8. 次に、これらのスイッチをgccまたはg ++のコンパイル定義に含めます(-Wl、-Bstatic -lhttpd -lpcre -lpcreposix -lapr-1 -laprutil-1 -Wl、-Bdynamic -pthread -ldl -lcrypt)
  9. 必要に応じて、*。oファイルでrmを実行して、fooディレクトリをクリーンアップします。

必要なように静的にコンパイルする必要はありませんが、必要なコンポーネントを気にせずにモジュールを任意のLinuxホストに移動できるようにしたかったのです。Apacheが機能するには、pcre(regex)、apr(すべてのライブラリ)、スレッド(proc / thread mutex)、dl(動的ロード)、およびcrypt(aprパスワード)が必要です。thread、dl、およびcryptはすでにマシン上にあるのが最も好きなので、静的にコンパイルしないことを選択しました。

幸せな狩猟。私の3日間の終わりのない物語が他の誰かに役立つことを願っています!

于 2012-05-05T12:58:12.083 に答える
1

これらのエラーは-pthread、コンパイルコマンドラインに追加しなかったため、pthreadライブラリがリンクされていないことを意味します。

(注:これ-pthreadは、ではなく、-lpthread単なるリンカーオプションではありません。)

于 2012-05-04T18:42:08.190 に答える
1

C ++でApacheモジュールを構築していて、動的リンクが必要な場合は、モジュールを正常に構築するために使用したg++コマンドラインを次に示します。Apache 2.2.22 /CentOS6.2で簡単にテストされました。

g++ [my files].cpp  -I/httpd/include/ -I/httpd/srclib/apr/include/ 
    -I/httpd/srclib/apr-util/include/ -I/usr/include/ -I/usr/include/apr-1/ 
    -I/httpd/os/unix/ -shared -fPIC -o mod_mymodule.so

私はApache/Linuxプログラミングの初心者であり、この情報を他の場所で見つけることができませんでした。OPのソリューションのおかげで、私は数日間の欲求不満の後で仕事を終えることができました。

httpdサーバーのコアコード(Windowsではlibhttpd.lib)に含まれているapache関数が見つからなかった場合に「未解決の参照」リンカーの問題を回避する方法を説明するのに役立つリンクもあります-これは*には存在しませんOPのように手動で作成しない限り、nix。基本的に、答えは-sharedフラグを使用して、これらの参照が実行時に自動的に解決されるようにすることでした。 http://www.yolinux.com/tokyoS/LibraryArchives-StaticAndDynamic.html

モジュールコードの「externC」を忘れずに、HTTPDをビルドするときにDSOサポートをビルドしてください。

これが他の誰かに役立つことを願っています!

于 2012-05-09T02:43:47.137 に答える