2012-08-13 90 views
1

我想在C++中編寫一個Apache模塊。C++ Apache模塊:失敗`_ZNSs4_Rep20_S_empty_rep_storageE`

基本模塊正在編譯並鏈接.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 

我認爲這個符號是什麼性病的錯位版本:: string的標準庫的使用。反正在compile或.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 ___ 
+0

我將鏈接改爲'g ++ - 4.7 -shared -ldl -fPIC -rdynamic -g -O3 -pthread -Wall -Wextra -Werror -fnon-call-exceptions -std = gnu ++ 11 -o ___。所以___',它的工作,我想。 – 2012-08-13 18:21:55

回答

3

您需要-lstdc++

鏈接使用g++鏈接(而不是gccld)自動執行此操作。

參見Compiling C++ programs在GCC手冊:

However, the use of gcc does not add the C++ library. g++ is a program that calls GCC [...] and automatically specifies linking against the C++ library.

N.B.選項-Wall -Wextra -Werror -fnon-call-exceptions -std=gnu++11在鏈接時不起作用,這些選項僅影響編譯階段,並在鏈接階段被忽略。在鏈接期間,GCC只調用鏈接器,並只傳遞對鏈接有效的選項。