use*_*936 5 c++ linux makefile
我有一个c ++ Linux项目的Makefile:
MODE ?= dbg
DIR = ../../../../../somdir/$(MODE)
SRC_FILES = a.cpp b.cpp
H_FILES = a.h
LDFLAGS += -L$(DIR)/lib/linux '-Wl,-R$$ORIGIN'
CPPFLAGS = -I$(DIR)/include
LIBRARIES = -lsomeso
ifeq (rel, $(MODE))
CFLAGS = -Wall -g -DNDEBUG
else
CFLAGS = -Wall -ansi -pedantic -Wconversion -g -DDEBUG -D_DEBUG
endif
sample: $(SRC_FILES) $(H_FILES) Makefile
g++ $(CPPFLAGS) $(CFLAGS) $(LDFLAGS) $(LIBRARIES) $(SRC_FILES) -o sample
Run Code Online (Sandbox Code Playgroud)
当我运行'make'时,它会构建项目,没有错误.但当我运行该项目时,它抱怨说:
error while loading shared libraries: libsomeso.so: cannot open shared object file: No such file or directory
Run Code Online (Sandbox Code Playgroud)
我在DIR中提供的路径转到保存共享对象的文件夹(相对于放置makefile的位置),如果它是错误的路径,为什么它在make过程中没有抱怨.
有人知道我错过了什么吗?
谢谢马特
LDFLAGS += -L$(DIR)/lib/linux '-Wl,-R$$ORIGIN'
Run Code Online (Sandbox Code Playgroud)
以上应该是:
LDFLAGS += -L$(DIR)/lib/linux -Wl,-R$(DIR)/lib/linux '-Wl,-R$$ORIGIN'
Run Code Online (Sandbox Code Playgroud)
也就是说,对于每个非标准动态库位置,应指定-L相应的-Wl,-R.$ORIGIN需要找到相对于可执行文件的动态库,不确定你是否需要它.
人们经常建议使用LD_LIBRARY_PATH.在我看来,这是一个糟糕的建议,因为它使部署更加复杂.