【问题标题】:C++ Apache Module: Fails on `_ZNSs4_Rep20_S_empty_rep_storageE`C++ Apache 模块:在 `_ZNSs4_Rep20_S_empty_rep_storageE` 上失败
【发布时间】:2012-08-13 18:14:19
【问题描述】:

我正在尝试用 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 ___

【问题讨论】:

  • 我将链接行更改为g++-4.7 -shared -ldl -fPIC -rdynamic -g -O3 -pthread -Wall -Wextra -Werror -fnon-call-exceptions -std=gnu++11 -o ___.so ___,我认为它可以工作。

标签: c++ linux apache c++11 shared-libraries


【解决方案1】:

你需要链接-lstdc++

使用g++ 链接(而不是gccld)会自动完成。

请参阅 GCC 手册中的 Compiling C++ programs

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

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

【讨论】:

    猜你喜欢
    • 2020-02-18
    • 2014-06-01
    • 1970-01-01
    • 1970-01-01
    • 2014-01-30
    • 1970-01-01
    • 2015-07-22
    • 2021-09-22
    • 2016-11-12
    相关资源
    最近更新 更多