我无法正确连接示例程序(在这种情况下针对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)
答案 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
中执行此操作您还可以让链接器在可执行文件中存储库的完整路径。
两种解决方案在使用不同用户和/或不同机器上的可执行文件方面有不同的权衡。