gpt4 book ai didi

c++ - 如何在 Makefile 中正确包含 -Wl,-rpath,$ORIGIN 链接器参数?

转载 作者:可可西里 更新时间:2023-11-01 17:20:48 32 4
gpt4 key购买 nike

我正在 linux (Ubuntu 16.04) 上准备一个 c++ 应用程序,使用我动态链接的几个 poco 库。我的项目文件夹包含:include、bin、lib、src 和 build 文件夹以及相关的 Makefile。到目前为止,我使用了以下从/usr/local/lib 获取库的 Makefile

CC := g++ 

# Folders
SRCDIR := src
BUILDDIR := build
TARGETDIR := bin

# Targets
EXECUTABLE := C++_APP
TARGET := $(TARGETDIR)/$(EXECUTABLE)

SRCEXT := cpp
SOURCES := $(shell find $(SRCDIR) -type f -name *.$(SRCEXT))
OBJECTS := $(patsubst $(SRCDIR)/%,$(BUILDDIR)/%,$(SOURCES:.$(SRCEXT)=.o))
CFLAGS := -c -Wall
INC := -I include -I /usr/local/include
LIB := -L /usr/local/lib -lPocoFoundation -lPocoNet -lPocoUtil

$(TARGET): $(OBJECTS)
@echo " Linking..."
@echo " $(CC) $^ -o $(TARGET) $(LIB)"; $(CC) $^ -o $(TARGET) $(LIB)

$(BUILDDIR)/%.o: $(SRCDIR)/%.$(SRCEXT)
@mkdir -p $(BUILDDIR)
@echo " $(CC) $(CFLAGS) $(INC) -c -o $@ $<"; $(CC) $(CFLAGS) $(INC) -c -o $@ $<

clean:
@echo " Cleaning...";
@echo " $(RM) -r $(BUILDDIR) $(TARGET)"; $(RM) -r $(BUILDDIR) $(TARGET)

.PHONY: clean

现在我希望在运行链接器期间仅在项目 lib 文件夹中搜索库,而不更改 LD_LIBRARY_PATH 或编辑 ld.so.conf。所以我搜索了一下,发现可以通过链接器参数-Wl,rpath,$ORIGIN来实现。所以我假设我需要添加以下语句

LDFLAGS := -Wl,-rpath,$ORIGIN/../lib

并更改 LIB 语句如下:

LIB := -L $ORIGIN/../lib -lPocoFoundation -lPocoNet -lPocoUtil 

但是它仍然从默认目录 (usr/local/lib) 获取库,因为我在项目 lib 文件夹中没有库的情况下对其进行了测试。我做错了什么?

最佳答案

不,你误会了。您需要传递文字字符串 $ORIGIN/../lib作为链接器的参数。 $ORIGIN token 在创建后保存在您的程序中,当运行时链接器开始运行您的程序时,它将替换 $ORIGIN。使用调用程序的当前路径。即使您已将程序复制到其他地方也是如此。因此,如果您以 /usr/local/bin/myprogram 运行程序然后运行时链接器将替换 $ORIGIN/usr/local/bin .如果复制到/opt/mystuff/libexec/myprogram然后运行时链接器将替换 $ORIGIN/opt/mystuff/libexec .

为了传递文字 $对于 make 配方调用的命令,您必须转义 $加倍:$$ .否则,make 将看到 $就像引入 make 变量或函数一样。请记住,make 变量避免括号等是完全合法的,如果它是单个字符(注意,$@$< 等)

所以当你写-Wl,-rpath,$ORIGIN/../lib make 将解释 $O$ORIGIN作为扩展名为 O 的变量,它是空的,给你 -Wl,-rpath,RIGIN/../lib .

你还必须转义 $来自 shell,否则它会尝试扩展 $ORIGIN作为您不想要的 shell 变量。

你想做这样的事情:

LDFLAGS = '-Wl,-rpath,$$ORIGIN/../lib' -L/usr/local/lib
LDLIBS = -lPocoFoundation -lPocoNet -lPocoUtil

$(TARGET): $(OBJECTS)
@echo " Linking..."
$(CC) $^ -o $@ $(LDFLAGS) $(LDLIBS)

(我不知道你为什么使用 @ 来隐藏命令,然后回显命令...为什么不直接取出 @echo 让 make 显示命令?)

关于c++ - 如何在 Makefile 中正确包含 -Wl,-rpath,$ORIGIN 链接器参数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42344932/

32 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com