1

私はC++でapacheモジュールを書き込もうとしています。

基本モジュールは、.soで正常にコンパイルおよびリンクされています。サーバーに接続すると、すべて問題ありません。

std::stringを使おうとするまで。今、私は次のエラーを受け取ります:

Cannot load mod_foo.so into server:
/usr/lib/apache2/modules/mod_foo.so: undefined symbol:
    _ZNSs4_Rep20_S_empty_rep_storageE

このシンボルは、標準ライブラリからstd::stringが使用するもののマングルバージョンであると思います。とにかく、コンパイル時または.soリンク時に、.soがこのライブラリを必要としていることを示すオプションを追加しますか?

.oファイルを次のようにコンパイルします。

g++-4.7 -fpic -c -O3 -pthread -g -iquote .
   -I/usr/include/apache2 -I/usr/include/apr-1.0 -Wall -Wextra
   -Werror -Wno-unknown-pragmas -fnon-call-exceptions
   -std=gnu++11 -x c++ -o ___.o ___

.soを次のようにリンクします。

ld -Bshareable -o ___.so ___
4

1 に答える 1

3

あなたはとリンクする必要があります-lstdc++

(またはg++の代わりに)リンクに使用すると、自動的にリンクされます。gccld

GCCマニュアルのC++プログラムのコンパイルを参照してください。

ただし、を使用gccしてもC++ライブラリは追加されません。g++GCC [...]を呼び出し、C++ライブラリに対するリンクを自動的に指定するプログラムです。

注意:これらのオプション-Wall -Wextra -Werror -fnon-call-exceptions -std=gnu++11はリンク時に効果がありません。これらのオプションはコンパイル段階にのみ影響し、リンク段階では無視されます。リンク中、GCCはリンカーを呼び出すだけで、リンクに有効なオプションのみを渡します。

于 2012-08-13T19:01:16.393 に答える