最近在公司的服務器上編譯c++代碼,由於是B/S結構的程序,所以需要將程序移植到另一臺機器上,但是,當把程序scp到另一臺機器上時,不能運行程序,出現了類似下面的提示:
error while loading shared libraries: libmysqlclient.so.18: cannot open shared object file: No such file or directory
通過查找資料發現,原來是動態鏈接庫的原因,通過ldd命令,得到如下輸出:
libmysqlclient.so.18 => not found
libstdc++.so.6 => /usr/lib64/libstdc++.so.6 (0x00002ace3fcab000)
libm.so.6 => /lib64/libm.so.6 (0x00002ace3fea9000)
libgcc_s.so.1 => /lib64/libgcc_s.so.1 (0x00002ace3ffff000)
libc.so.6 => /lib64/libc.so.6 (0x00002ace4010c000)
/lib64/ld-linux-x86-64.so.2 (0x00002ace3fb8f000)
由於庫文件在連接(靜態庫和動態庫)和運行(僅限於使用動態庫的程序)時被使用,其搜索路徑是在系統中進行設置的。一般linux系統把/lib和/usr/lib作爲默認的庫搜索路徑,處於默認庫搜索路徑之外的庫,需要用戶將庫位置添加到庫的搜索路徑之中。
後來發現linux系統的一個環境變量LD_LIBRARY_PATH,是用於指定查找動態庫(共享庫或者動態鏈接庫)時除了默認路徑之外的其它路徑。(該路徑在默認路徑之前查找)
總結:
移植程序時的經常碰到需要使用一些特定的動態庫,而這些編譯好的動態庫放在我們自己建立的目錄裏,這時可以將這些目錄設置到LD_LIBRARY_PATH中。