Stack overflow地址:c++ - usr/bin/ld: cannot find -l - Stack Overflow
翻譯:
我嘗試編譯我的程序但是它返回了這個錯誤:use/bin/ld: cannot find -l在我的Makefile文件中乎完,我使用了g++并且鏈接了我的庫,這個庫是位于其他目錄中的庫的符號鏈接
有其他選項需要添加來使make成功嗎?
1Answer:
如果你得庫的名字叫做libxyz.so趣钱,并且它位于:/home/user/myDir
需要在你的程序中鏈接:g++ -L/home/user/myDir -lxyz myprog.cpp -o myprog
2Answer:
為了找出鏈接器在尋找什么被啼,以詳細信息模式運行它
舉個例子,我遇到過這么一個問題膏燕,當我嘗試編譯MySQL支持ZLIB的時候献丑。我遇見了這么一個錯誤在編譯期間:
/usr/bin/ld:cannot find -lzlib
我做了一些google搜索并遇到了不同的問題涛贯,那些人們確保沒事的诽嘉。實際上文件存在,如果不存在的話,就是創(chuàng)建一個符號鏈接指向版本文件虫腋,
舉個例子骄酗,zlib.so.1.2.8,但是在我檢查的時候悦冀,zlib.so確實存在趋翻,我想這絕對不是問題的原因。
我在網(wǎng)上看到另一篇文章盒蟆,建議運行make帶有LD_DEBUG=all踏烙,如:
LD_DEBUG=all make
盡管我得到了大量的調(diào)試輸出,這沒有任何實際用途历等。它加劇了我的困惑讨惩。因此,我快要放棄了寒屯。
然后荐捻,我恍然大悟。我想要檢查一下ld命令的help文檔寡夹。
ld --help
由此处面,我想到了運行l(wèi)d用詳細模式(想象一下)
ld -lzlib --verbose
下面是我得到的輸出:
==================================================
attempt to open /usr/x86_64-linux-gnu/lib64/libzlib.so failed
attempt to open /usr/x86_64-linux-gnu/lib64/libzlib.a failed
attempt to open /usr/local/lib64/libzlib.so failed
attempt to open /usr/local/lib64/libzlib.a failed
attempt to open /lib64/libzlib.so failed
attempt to open /lib64/libzlib.a failed
attempt to open /usr/lib64/libzlib.so failed
attempt to open /usr/lib64/libzlib.a failed
attempt to open /usr/x86_64-linux-gnu/lib/libzlib.so failed
attempt to open /usr/x86_64-linux-gnu/lib/libzlib.a failed
attempt to open /usr/local/lib/libzlib.so failed
attempt to open /usr/local/lib/libzlib.a failed
attempt to open /lib/libzlib.so failed
attempt to open /lib/libzlib.a failed
attempt to open /usr/lib/libzlib.so failed
attempt to open /usr/lib/libzlib.a failed
/usr/bin/ld.bfd.real: cannot find -lzlib
Ding,ding,ding...
所以,最終解決了它我可以編譯MySQL用我自己的ZLIB版本(而不是捆綁的版本):
????sudo ln -s /usr/lib/libz.so.1.2.8 /usr/lib/libzlib.so
是吧菩掏。
3Answer:
在使用g++編譯期間魂角,修改Makefile中的-L選項可能是不正確的≈浅瘢可以通過修改LIBRARY_PATH的定義進行編譯或颊。我把我額外的庫放在了/opt/lib中,所以我這么做了:
$export LIBRARY_PATH=/opt/lib
然后make成功編譯并且鏈接传于。
運行程序帶著共享庫的定義:
$export LD_LIBRARY_PATH=/opt/lib
在執(zhí)行程序之前囱挑。
4Answer:
幾乎沒有任何答案可以定位一個非常初學(xué)者的問題,因為一開始沒有安裝所需要的庫沼溜。
在Debinanish平臺平挑,如果libfoo丟失,你可以頻繁的安裝它像下面這樣:
? ? apt-get install libfoo-dev
-dev版本的包是開發(fā)者所需要的系草,即是很簡單的開發(fā)工作編譯源碼也需要連接這個庫通熄。
這個包的名字有時候需要帶一些裝飾(libfoo0-dev? foo-dev不帶lib前綴,等等)找都,或者你可以簡單的使用發(fā)行版本包準確的搜索那個包被詳細的提供唇辨。
(如果這里多于一個包,你可能需要找出他們之間的區(qū)別能耻。找出最酷或者最流行的是一個常見的捷徑赏枚,但不是可接受的對于任何嚴肅的開發(fā)者來說亡驰。)
對于其他架構(gòu)(尤其是RPM),相同的過程也可以使用饿幅,盡管細節(jié)不一致凡辱。