LIBPATHS 未在 Makefile 中使用,找不到共享对象
Posted
技术标签:
【中文标题】LIBPATHS 未在 Makefile 中使用,找不到共享对象【英文标题】:LIBPATHS not being used in Makefile, can't find shared object 【发布时间】:2010-03-11 16:26:52 【问题描述】:我无法正确链接示例程序(在本例中针对 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)
【问题讨论】:
【参考方案1】:您的LIBPATHS
告诉链接器在链接解析符号时在哪里可以找到库。
在运行时,您需要告诉加载程序在哪里可以找到库。它不知道编译时发生了什么。您可以使用上面提到的LD_LIBRARY_PATH
变量,或者签入/etc/ld.so.conf
和它的朋友。
【讨论】:
【参考方案2】:默认情况下,动态库的路径不存储在可执行文件中。您可以:
在运行时使用 LD_LIBRARY_PATH 提供搜索动态库的路径
在链接时使用 -Wl,-Rpath 在可执行文件中存储路径
【讨论】:
【参考方案3】:一种解决方案是将 /usr/local/lib 添加到环境变量 LD_LIBRARY_PATH。 您可以在 .profile 或 .cshrc 中执行此操作
您还可以让链接器将库的完整路径存储在可执行文件中。
两种解决方案在不同用户和/或在不同机器上使用可执行文件方面有不同的权衡。
【讨论】:
以上是关于LIBPATHS 未在 Makefile 中使用,找不到共享对象的主要内容,如果未能解决你的问题,请参考以下文章
Lua 抛出错误 luajit: error loading module 'libpaths' from file
> library('ggplot2') Error in loadNamespace(i, c(lib.loc, .libPaths()), versionCheck = vI