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++to link (而不是gccor ld)自动完成。

请参阅GCC 手册中的编译 C++ 程序:

但是,使用gcc并没有添加 C++ 库。g++是一个调用 GCC [...] 并自动指定与 C++ 库的链接的程序。

注意选项-Wall -Wextra -Werror -fnon-call-exceptions -std=gnu++11在链接时无效,这些选项仅影响编译阶段并在链接阶段被忽略。在链接期间,GCC 只调用链接器并只传递对链接有效的选项。

于 2012-08-13T19:01:16.393 回答