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 中使用,找不到共享对象的主要内容,如果未能解决你的问题,请参考以下文章

R语言libPaths函数获取或者设置包安装的路径实战

使用 gcc 编译器时未在此范围内声明“memcpy”

Lua 抛出错误 luajit: error loading module 'libpaths' from file

r libPaths

R语言学习之packages

> library('ggplot2') Error in loadNamespace(i, c(lib.loc, .libPaths()), versionCheck = vI