場景說明: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/