全靜態標準庫鏈接方式

場景說明:RedHat6.4 + GCC4.4.6

1)在應用boost靜態庫的過程中,參考了一篇文章,裏面提供了-static參數,指定程序使用靜態庫,指令如下:

g++ 2testboost.cpp -o test -I /usr/local/include/boost/    /root/lib/libboost_system.a  /root/lib/libboost_filesystem.a  -static

在實驗機器上,編譯出錯:/usr/bin/ld: cannot find -lm

大多數的解決方案都是搜索是否存在libm.so文件,而且確實已經在/usr/lib目錄下存在。

2)編譯一個全靜態的程序,添加-static,編譯出錯如上所示

3)編譯一個半靜態的程序,添加-static-libgcc,編譯出錯如上所示

4)添加-static-libstdc++,編譯出錯如下:g++: 無法識別的選項‘-static-libstdc++’


代碼如下:

#include <iostream>

#include <boost/filesystem.hpp>

using namespace boost::filesystem;

int main(int argc, char *argv[])

  if (argc < 2) 

  {    

    std::cout << "Usage: tut1 path\n";    

    return 1;  

  }  

  std::cout << argv[1] << " " << file_size(argv[1]) << std::endl;  

  return 0;
}


編譯過程:


靜態鏈接:

 g++ 2testboost.cpp  -I /home/boost/boost_1_49_0/boost/  /home/boost/boost_1_49_0/stage/lib/libboost_system.a /home/boost/boost_1_49_0/stage/lib/libboost_filesystem.a -o 2test 


動態鏈接:

使用安裝之後的目錄

g++ 2testboost.cpp -I /usr/local/include/boost/ -L /usr/local/lib -lboost_system -lboost_filesystem -o 2test


使用原有的生成目錄

g++ 2testboost.cpp -I /home/boost/boost_1_49_0/boost/ -L /home/boost/boost_1_49_0/stage/lib  -lboost_system -lboost_filesystem -o 2test


如果沒有指定安裝的目錄,運行時候需要ldconfig /home/boost/boost_1_49_0/stage/lib


注意:-L參數指定的目錄目前只能夠是動態庫的目錄,每一個靜態庫都必須填寫完整的路徑,否則無法鏈接成功!!


解決方案:

yum install glibc-static

該命令安裝靜態編譯版本的C庫。網上有的執行了如下的指令:

#yum install libstc++-static

但是使用yum 安裝的時候沒有找到相關的安裝包,但是同樣解決了問題.出現上面問題的原因是GCC的版本不支持,默認情況下安裝的是動態的C庫,當需要將靜態C庫鏈接到程序的時候出現了cannot find -lm的錯誤。


ldd能夠分析出程序依賴的動態庫,測試是否是全靜態程序:

[root@jack ~]# g++ 2testboost.cpp -o test -I /usr/local/include/boost/    /root/lib/libboost_system.a  /root/lib/libboost_filesystem.a  -static

[root@jack ~]# ldd test

不是動態可執行文件



參考:

http://www.tuicool.com/articles/Ifqm2uM

http://bbs.csdn.net/topics/391880682

http://www.ibm.com/developerworks/cn/linux/l-cn-linklib/


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章