c++ - Makefile 在运行时无法链接库

标签 c++ linux makefile gnu-make

因此,我正在使用 nvidia 的 deepstream sdk 并尝试修改给出的示例示例之一的 makefile,因为我希望链接和添加我自己的库。这是正在使用的 makefile,我将 CUSTOM_LIB 的路径设置为指向我的库的位置。问题是项目已成功编译,但在运行时,它无法找到自定义库。我对生成的可执行文件执行了 ldd,并且该库也显示为“未找到”。我认为这与 rpath 有关,但我不确定。

APP:= sample

TARGET_DEVICE = $(shell gcc -dumpmachine | cut -f1 -d -)

NVDS_VERSION:=4.0

LIB_INSTALL_DIR?=/opt/nvidia/deepstream/deepstream-$(NVDS_VERSION)/lib/

ifeq ($(TARGET_DEVICE),aarch64)
  CFLAGS:= -DPLATFORM_TEGRA
endif

CUDA_VER:=10.0
CC:=g++

SRCS:= $(wildcard ../src/*.c)
#SRCS+= $(wildcard ../../apps-common/src/*.c)
#SRCS+=

INCS:= $(wildcard ../include/*.h)

PKGS:= gstreamer-1.0 gstreamer-video-1.0 x11 opencv

OBJS:= $(SRCS:.c=.o)

CFLAGS+= -I../include -I/usr/include -I$(CUSTOM_LIB)/include -I/usr/local/cuda-10.0/targets/aarch64-linux/include/ -I/usr/include/jsoncpp  -DDS_VERSION_MINOR=0 -DDS_VERSION_MAJOR=4 -fpermissive -Wnarrowing

LIBS+= -L$(LIB_INSTALL_DIR)  -L/usr/lib/aarch64-linux-gnu -L$(CUSTOM_LIB)/lib -L/usr/lib/aarch64-linux-gnu/ -lcurl -letlic -letolm -lssl -lcrypto -llogger -lpthread -lsqlite3 -ljsoncpp -lnvdsgst_meta -lnvbufsurface -lnvbufsurftransform -lnvds_meta -lnvdsgst_helper -lnvds_utils -lm -L/usr/local/cuda-$(CUDA_VER)/lib64/  -lcudart \
-lgstrtspserver-1.0 -Wl,-rpath,$(LIB_INSTALL_DIR)

CFLAGS+= `pkg-config --cflags $(PKGS)`

LIBS+= `pkg-config --libs $(PKGS)`

all: $(APP)

debug: CXXFLAGS += -DDEBUG -g
debug: CFLAGS += -DDEBUG -g
debug: $(APP)

%.o: %.c $(INCS) Makefile
    $(CC) -c -o $@ $(CFLAGS) $<


$(APP): $(OBJS) Makefile
    $(CC) -o $(APP) $(OBJS) $(LIBS)

clean:
    rm -rf $(OBJS) $(APP)

最佳答案

您需要将 rpath 设置为以冒号分隔的目录列表,在其中可以找到您的库。您仅添加 LIB_INSTALL_DIR,但不添加 CUSTOM_LIB_DIR。一般来说,传递给 -L 的所有内容都需要传递给 -rpath,除非有特定原因不这样做。例如,如果您正在构建一个包含多个库的包,并且要安装在/usr/lib 这样的标准位置,则不必将库临时所在的目录添加到 -rpath。如果您要安装到非标准目录,请添加目录。

关于c++ - Makefile 在运行时无法链接库,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59407217/

相关文章:

c++ - boost::asio async_read 保证读取所有字节

linux - cloudformation/用户数据...传递操作系统用户密码而不回显到日志

c++ - 有没有办法从一个程序打开一个新的控制台然后 cout 进去?

c++ - 如何在 C++ 中使用 makefile 编译 "not-main"(仅限 .hpp)文件?

java - 如何为java创建具有多个文件目录的Makefile

c++ - 绑定(bind)在同一端口上的两个进程如何接收相同的消息?

c++ - 为什么 boost::asio::ip::tcp::basic_stream_socket::available 运行时间长?

c++ - C++中对接MDI客户区

linux - awk 没有选择字符串和管道作为分隔符

c - makefile中 "include"和 "-include"的区别