LIBPATHS没有在Makefile中使用,找不到共享对象

时间:2010-03-11 16:26:52

标签: c++ linux gcc makefile

我无法正确连接示例程序(在这种情况下针对ICU库)。当我'做'时,一切都很好。但是当我运行它时,它说它无法找到其中一个.so的。我仔细检查了它们都安装在/ usr / local / lib中。我发现它是在查找/ usr / lib。如果我从那里符号链接到那里的实际位置,它就可以工作。

为什么我的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)

3 个答案:

答案 0 :(得分:2)

默认情况下,动态库的路径不存储在可执行文件中。你可以:

  • 在运行时使用LD_LIBRARY_PATH提供搜索动态库的路径

  • 在链接时使用-Wl,-R 路径在可执行文件中存储路径

答案 1 :(得分:2)

您的LIBPATHS告诉链接器在链接到解析符号时在哪里找到库。

在运行时,您需要告诉加载程序在哪里找到库。它不知道编译时发生了什么。您可以使用上面提到的LD_LIBRARY_PATH变量,也可以查看/etc/ld.so.conf和它的朋友。

答案 2 :(得分:1)

一种解决方案是将/ usr / local / lib添加到环境变量LD_LIBRARY_PATH。 您可以在.profile或.cshrc

中执行此操作

您还可以让链接器在可执行文件中存储库的完整路径。

两种解决方案在使用不同用户和/或不同机器上的可执行文件方面有不同的权衡。