2010-03-11 48 views
3

我無法正確連接示例程序(在本例中是針對ICU庫)。當我做'做'時,一切都很好。但是當我運行它時,它說它找不到.so的一個。我再次檢查他們都安裝在/ usr/local/lib中。我發現它是在/ usr/lib中查找的。如果我從那裏符號鏈接到那裏的實際位置,它的作品。LIBPATHS未在Makefile中使用,無法找到共享對象

爲什麼我的LIBPATHS被忽略或不被使用?

這裏是Makefile中

CC = g++ 

INCPATHS = -I/usr/local/include 

CFLAGS = -c -Wall $(INCPATHS) 

LIBPATHS = -L/usr/local/lib/ 
LIBS = $(LIBPATHS) -licuio -licui18n -licuuc -licuio -licudata 

EXECUTABLE = prog 

print_linking = echo -e "\033[32m" "Linking: $<" "\033[39m" 
print_compiling = echo -e "\033[33m" "Compiling: $<" "\033[39m" 
print_cleaning = echo -e "\033[31m" "Cleaning: `pwd`" "\033[39m" 


all: main 

# [target]: [dependencies] 
# <tab> system command 
main: main.o 
    @$(print_linking) 
    @$(CC) -o $(EXECUTABLE) main.o $(LIBS) >> /dev/null 

main.o: main.cpp 
    @$(print_compiling) 
    @$(CC) $(CFLAGS) main.cpp 

clean: 
    @$(print_cleaning) 
    @rm -rf *.o *~ $(EXECUTABLE) 

回答

2

您的LIBPATHS告訴鏈接器在鏈接到解析符號時在哪裏找到庫。

在運行時,您需要告訴加載程序在哪裏可以找到庫。它不知道編譯時發生了什麼。你可以使用上面提到的LD_LIBRARY_PATH變量,或者查看/etc/ld.so.conf,它是朋友。

2

的動態庫的路徑並不存儲在默認的可執行文件。您可以:在運行時

  • 使用LD_LIBRARY_PATH給的路徑在哪裏搜索動態庫

  • 使用-Wl,-R 路徑在鏈接時存儲在可執行

    的路徑
1

一種解決方案是將/ usr/local/lib添加到環境變量LD_LIBRARY_PATH中。 您可以在.profile或.cshrc中執行此操作。

您還可以讓鏈接器在可執行文件中存儲庫的完整路徑。

這兩種解決方案在使用不同用戶和/或不同機器上的可執行文件方面有不同的折衷。