在學習gcc靜態庫動態庫編譯的時候選用靜態庫編譯時出錯顯示:/usr/lib/ld:cannot find -lc
百度:/usr/lib/ld:cannot find -lc多處給的解決方案為:
然而並不能解決問題,最終定位發現是靜態編譯的問題。而且不止會出現這種情況:
/usr/lib/ld:cannot find -lc
/usr/lib/ld:cannot find -lgcc_s
/usr/lib/ld:cannot find -lm
等的錯誤,主要原因在靜態編譯時需要鏈接靜調庫。如上命令:
[xiaohexiansheng@centos6 app]$ gcc -static -I./libs main.c -o app -L./libs -lcrypto -lfunc
如果在編譯時去掉-static選項選用動態庫編譯則不會出現此種情況
[xiaohexiansheng@centos6 app]$ gcc -I./libs main.c -o app -L./libs -lcrypto -lfunc
[xiaohexiansheng@centos6 app]$ ls
app libs main.c
非靜態編譯時ldd filename,顯示如下,這是可執行程序所需的動態庫,運行可執行程序時需要的動態庫。
[xiaohexiansheng@centos6 app]$ ldd app
linux-gate.so.1 => (0x004ad000)
libcrypto.so => /usr/lib/libcrypto.so (0x03ad9000)
libfunc.so => not found
libc.so.6 => /lib/libc.so.6 (0x0052a000)
libdl.so.2 => /lib/libdl.so.2 (0x0070c000)
libz.so.1 => /lib/libz.so.1 (0x00713000)
/lib/ld-linux.so.2 (0x00508000)
靜態編譯時需要將所有的.a庫鏈接到可執行文件中,所以需要libc靜態庫文件,在系統找查找glibc-static提示沒有庫文件。
#yum install glibc-static安裝靜態庫。