linux下源碼編譯curl報錯.

說明: 因爲現網的php不帶curl功能, 須要編譯生成一個libcurl.so給php生成curl.so模塊用. 而且須要支持 openssl . 編譯的過程並不順利, 這裏作下記錄備忘.

使用以下configure命令生成配置文件. ssl是提早編譯好的 openssl .
    ./configure --prefix=/home/nemo/progs/curl --with-ssl=/home/nemo/progs/ssl

問題1編譯報錯:
Making all in src
make[1]: Entering directory `/data/home/nemo/libs/curl-7.27.0/src'
make  all-am
make[2]: Entering directory `/data/home/nemo/libs/curl-7.27.0/src'
/bin/sh ../libtool --tag=CC --mode=link gcc  -g0 -O2 -Wno-system-headers    -L/home/nemo/progs/ssl/lib -o curl  hugehelp.o tool_binmode.o tool_bname.o tool_cb_dbg.o tool_cb_hdr.o tool_cb_prg.o tool_cb_rea.o tool_cb_see.o tool_cb_wrt.o tool_cfgable.o tool_convert.o tool_dirhie.o tool_doswin.o tool_easysrc.o tool_formparse.o tool_getparam.o tool_getpass.o tool_help.o tool_helpers.o tool_homedir.o tool_libinfo.o tool_main.o tool_metalink.o tool_mfiles.o tool_msgs.o tool_operate.o tool_operhlp.o tool_panykey.o tool_paramhlp.o tool_parsecfg.o tool_setopt.o tool_sleep.o tool_urlglob.o tool_util.o tool_vms.o tool_writeenv.o tool_writeout.o tool_xattr.o strtoofft.o strdup.o rawstr.o nonblock.o  ../lib/libcurl.la -lrt -lz  
libtool: link: gcc -g0 -O2 -Wno-system-headers -o .libs/curl hugehelp.o tool_binmode.o tool_bname.o tool_cb_dbg.o tool_cb_hdr.o tool_cb_prg.o tool_cb_rea.o tool_cb_see.o tool_cb_wrt.o tool_cfgable.o tool_convert.o tool_dirhie.o tool_doswin.o tool_easysrc.o tool_formparse.o tool_getparam.o tool_getpass.o tool_help.o tool_helpers.o tool_homedir.o tool_libinfo.o tool_main.o tool_metalink.o tool_mfiles.o tool_msgs.o tool_operate.o tool_operhlp.o tool_panykey.o tool_paramhlp.o tool_parsecfg.o tool_setopt.o tool_sleep.o tool_urlglob.o tool_util.o tool_vms.o tool_writeenv.o tool_writeout.o tool_xattr.o strtoofft.o strdup.o rawstr.o nonblock.o  -L/home/nemo/progs/ssl/lib ../lib/.libs/libcurl.so -lrt -lz -Wl,-rpath -Wl,/home/nemo/progs/curl/lib
../lib/.libs/libcurl.so:  undefined  reference to `EVP_enc_null'
../lib/.libs/libcurl.so:  undefined  reference to `COMP_compress_block'
../lib/.libs/libcurl.so:  undefined  reference to `COMP_CTX_new'
../lib/.libs/libcurl.so:  undefined  reference to `SRP_Calc_B'
../lib/.libs/libcurl.so:  undefined  reference to `BIO_s_socket'
../lib/.libs/libcurl.so:  undefined  reference to `pqueue_next'
../lib/.libs/libcurl.so:  undefined  reference to `pqueue_insert'
../lib/.libs/libcurl.so:  undefined  reference to `SRP_check_known_gN_param'
../lib/.libs/libcurl.so:  undefined  reference to `COMP_expand_block'
../lib/.libs/libcurl.so:  undefined  reference to `pqueue_peek'
../lib/.libs/libcurl.so:  undefined  reference to `SRP_Calc_x'
../lib/.libs/libcurl.so:  undefined  reference to `pqueue_free'
../lib/.libs/libcurl.so:  undefined  reference to ` OPENSSL _DIR_read'
../lib/.libs/libcurl.so:  undefined  reference to `SRP_Calc_client_key'
../lib/.libs/libcurl.so:  undefined  reference to `X509_STORE_set_default_paths'
../lib/.libs/libcurl.so:  undefined  reference to `COMP_CTX_free'
../lib/.libs/libcurl.so:  undefined  reference to `pqueue_find'
../lib/.libs/libcurl.so:  undefined  reference to `pqueue_pop'
../lib/.libs/libcurl.so:  undefined  reference to `pitem_free'
../lib/.libs/libcurl.so:  undefined  reference to `SRP_create_verifier_BN'
../lib/.libs/libcurl.so:  undefined  reference to `SRP_Verify_B_mod_N'
../lib/.libs/libcurl.so:  undefined  reference to `pqueue_iterator'
../lib/.libs/libcurl.so:  undefined  reference to `SRP_get_default_gN'
../lib/.libs/libcurl.so:  undefined  reference to `pqueue_size'
../lib/.libs/libcurl.so:  undefined  reference to `X509_certificate_type'
../lib/.libs/libcurl.so:  undefined  reference to `SRP_Calc_server_key'
../lib/.libs/libcurl.so:  undefined  reference to `SRP_Verify_A_mod_N'
../lib/.libs/libcurl.so:  undefined  reference to `SRP_Calc_A'
../lib/.libs/libcurl.so:  undefined  reference to `pqueue_new'
../lib/.libs/libcurl.so:  undefined  reference to `SRP_Calc_u'
../lib/.libs/libcurl.so:  undefined  reference to ` OPENSSL _DIR_end'
../lib/.libs/libcurl.so:  undefined  reference to `COMP_zlib'
../lib/.libs/libcurl.so:  undefined  reference to `ERR_load_crypto_strings'
../lib/.libs/libcurl.so:  undefined  reference to `X509_STORE_load_locations'
../lib/.libs/libcurl.so:  undefined  reference to `pitem_new'
collect2: ld returned 1 exit status
make[2]: *** [curl] Error 1
make[2]: Leaving directory `/data/home/nemo/libs/curl-7.27.0/src'
make[1]: *** [all] Error 2
make[1]: Leaving directory `/data/home/nemo/libs/curl-7.27.0/src'
make: *** [all-recursive] Error 1

分析:
1) 這些報錯未定義的符號是什麼符號? 是屬於哪一個庫的? 是 openssl 的嗎? (能夠經過nm ssl的so或庫查看)
   經查是, crypto庫的
2) 那麼crypto庫在哪裏? 有沒有默認連接進來?
   經查是個crypto.a文件, 放在了ssl的編譯號的同級目錄裏 : /home/nemo/progs/ssl/lib/libcrypto.a
   另外, 系統默認也帶了crypto :  /usr/local/ssl/lib/libcrypto.a

   另外, 查看編譯連接的選項, 指定了對應的目錄, -L/home/nemo/progs/ssl/lib
   可是卻沒有指定 -lcrypto ?!!!
  
   解決: 進入src目錄, 手動執行連接命令, 在最後補上 crypto 便可經過.
   /bin/sh ../libtool --tag=CC --mode=link gcc  -g0 -O2 -Wno-system-headers    -L/home/nemo/progs/ssl/lib -o curl  hugehelp.o tool_binmode.o tool_bname.o tool_cb_dbg.o tool_cb_hdr.o tool_cb_prg.o tool_cb_rea.o tool_cb_see.o tool_cb_wrt.o tool_cfgable.o tool_convert.o tool_dirhie.o tool_doswin.o tool_easysrc.o tool_formparse.o tool_getparam.o tool_getpass.o tool_help.o tool_helpers.o tool_homedir.o tool_libinfo.o tool_main.o tool_metalink.o tool_mfiles.o tool_msgs.o tool_operate.o tool_operhlp.o tool_panykey.o tool_paramhlp.o tool_parsecfg.o tool_setopt.o tool_sleep.o tool_urlglob.o tool_util.o tool_vms.o tool_writeenv.o tool_writeout.o tool_xattr.o strtoofft.o strdup.o rawstr.o nonblock.o  ../lib/libcurl.la -lrt -lz  -lcrypto

問題2 
發現編譯出來的libcurl.so雖然成功編譯出來了, 經過ldd -r 查看, 仍然包含了不少未定義的符號, 就像上面的編譯curl可執行文件報錯的符號同樣.

nemo@ISD_36_57_sles10sp1:[curl-7.20.1]$ ldd -r ./lib/.libs/libcurl.so
undefined   symbol : X509_certificate_type    (./lib/.libs/libcurl.so)
undefined  symbol : COMP_CTX_free    (./lib/.libs/libcurl.so)
undefined  symbol : COMP_CTX_new    (./lib/.libs/libcurl.so)
undefined  symbol : COMP_compress_block    (./lib/.libs/libcurl.so)
undefined  symbol : COMP_expand_block    (./lib/.libs/libcurl.so)
undefined  symbol : pqueue_find    (./lib/.libs/libcurl.so)
undefined  symbol : pitem_new    (./lib/.libs/libcurl.so)
undefined  symbol : pqueue_insert    (./lib/.libs/libcurl.so)
undefined  symbol : pqueue_iterator    (./lib/.libs/libcurl.so)
undefined  symbol : pqueue_next    (./lib/.libs/libcurl.so)
undefined  symbol : pitem_free    (./lib/.libs/libcurl.so)
undefined  symbol : pqueue_pop    (./lib/.libs/libcurl.so)
undefined  symbol : pqueue_peek    (./lib/.libs/libcurl.so)
undefined  symbol : X509_STORE_load_locations    (./lib/.libs/libcurl.so)
undefined  symbol : X509_STORE_set_default_paths    (./lib/.libs/libcurl.so)
undefined  symbol : BIO_s_socket    (./lib/.libs/libcurl.so)
undefined  symbol : ERR_load_crypto_strings    (./lib/.libs/libcurl.so)
undefined  symbol: OPENSSL _DIR_read    (./lib/.libs/libcurl.so)
undefined  symbol: OPENSSL _DIR_end    (./lib/.libs/libcurl.so)
    linux-gate.so.1 =>  (0xbfffe000)
    librt.so.1 => /lib/librt.so.1 (0xb7cf4000)
    libdl.so.2 => /lib/libdl.so.2 (0xb7cf0000)
    libz.so.1 => /lib/libz.so.1 (0xb7cde000)
    libc.so.6 => /lib/libc.so.6 (0xb7bbd000)
    libpthread.so.0 => /lib/libpthread.so.0 (0xb7ba9000)
    /lib/ld-linux.so.2 (0x80000000)
undefined  symbol : COMP_zlib    (./lib/.libs/libcurl.so)
undefined  symbol : EVP_enc_null    (./lib/.libs/libcurl.so)
undefined  symbol : SRP_Calc_A    (./lib/.libs/libcurl.so)
undefined  symbol : SRP_check_known_gN_param    (./lib/.libs/libcurl.so)
undefined  symbol : SRP_Verify_B_mod_N    (./lib/.libs/libcurl.so)
undefined  symbol : SRP_Calc_u    (./lib/.libs/libcurl.so)
undefined  symbol : SRP_Calc_x    (./lib/.libs/libcurl.so)
undefined  symbol : SRP_Calc_client_key    (./lib/.libs/libcurl.so)
undefined  symbol : SRP_Verify_A_mod_N    (./lib/.libs/libcurl.so)
undefined  symbol : SRP_Calc_server_key    (./lib/.libs/libcurl.so)
undefined  symbol : SRP_get_default_gN    (./lib/.libs/libcurl.so)
undefined  symbol : SRP_create_verifier_BN    (./lib/.libs/libcurl.so)
undefined  symbol : SRP_Calc_B    (./lib/.libs/libcurl.so)
undefined  symbol : pqueue_free    (./lib/.libs/libcurl.so)
undefined  symbol : pqueue_new    (./lib/.libs/libcurl.so)
undefined  symbol : pqueue_size    (./lib/.libs/libcurl.so   

分析:
    通過把整個make的成 >make.log 2>&1, 定向到文件裏面, 發現make.log有以下可疑的地方.
    ... // 省了好多.
    -L/home/nemo/progs/ssl/lib -lrt -lcrypto -lssl -ldl -lz  -O2   -Wl,-soname -Wl,libcurl.so.4 -o .libs/libcurl.so.4.2.0

    -lcrypto -lssl , crypto竟然放在ssl的前面 ? 若是ssl依賴crypto, 應該ssl放在前面纔對. 
解決:
    進入lib目錄, 修改Makefile
    LIBCURL_LIBS = -lssl -lcrypto -lrt -lcrypto -lssl -ldl -lz  => 
     LIBCURL_LIBS = -lssl -lcrypto -lrt -ldl -lz  便可.

總結, 編譯生成curl時, 需手動命令行加入 -lcrypto編譯;(改Makefile無論用) 變成生成libcurl.so時, 能夠修改Makefile編譯.
相關文章
相關標籤/搜索