【问题标题】:How to link opencv lib in a given directory in makefile如何在makefile的给定目录中链接opencv lib
【发布时间】:2020-11-04 03:37:37
【问题描述】:

我正在编译一个项目,我想将它链接到给定目录中的opencv,而不是像/usr/local/lib/libopencv这样的系统目录

最后是默认的makefile,链接到系统目录/usr/local/lib

我要链接的opencv位于目录../../third_party/opencv/,有../../third_party/opencv/include/../../third_party/opencv/lib/。绝对路径是/home/somepath/third_party/opencv/

我应该如何修改makefile 以使项目链接到我要使用的opencv,而不是系统版本?

目前,当我编译项目并使用ldd检查它的依赖关系时,比如ldd evaluate | grep opencv,我得到了以下信息。这意味着该项目仍然链接到系统版本,而不是我选择的。

libopencv_highgui.so.3.0 => /usr/local/lib/libopencv_highgui.so.3.0 (0x00007efc72527000)
libopencv_imgcodecs.so.3.0 => /usr/local/lib/libopencv_imgcodecs.so.3.0 (0x00007efc7217a000)
libopencv_imgproc.so.3.0 => /usr/local/lib/libopencv_imgproc.so.3.0 (0x00007efc711f8000)
libopencv_core.so.3.0 => /usr/local/lib/libopencv_core.so.3.0 (0x00007efc70565000)

谢谢你帮助我!!!

PROJECT_NAME:= evaluate

# config ----------------------------------

INCLUDE_DIRS := include
LIBRARY_DIRS := lib

COMMON_FLAGS := -DCPU_ONLY
CXXFLAGS := -std=c++11 -fopenmp -D_GLIBCXX_USE_CXX11_ABI=0

LDFLAGS := -fopenmp -Wl,-rpath,./lib

OPENCV = `pkg-config opencv --cflags --libs`
LIB = $(OPENCV)
BUILD_DIR := build

# make rules -------------------------------
CXX ?= g++
BUILD_DIR ?= ./build

LIBRARIES += opencv_core opencv_highgui opencv_imgproc #opencv_imgcodecs

CXXFLAGS += $(COMMON_FLAGS) $(foreach includedir,$(INCLUDE_DIRS),-I$(includedir))
LDFLAGS +=  $(COMMON_FLAGS) $(foreach includedir,$(LIBRARY_DIRS),-L$(includedir)) $(foreach library,$(LIBRARIES),-l$(library))
SRC_DIRS += $(shell find * -type d -exec bash -c "find {} -maxdepth 1 \( -name '*.cpp' -o -name '*.proto' \) | grep -q ." \; -print)
CXX_SRCS += $(shell find src/ -name "*.cpp")
CXX_TARGETS:=$(patsubst %.cpp, $(BUILD_DIR)/%.o, $(CXX_SRCS))
ALL_BUILD_DIRS := $(sort $(BUILD_DIR) $(addprefix $(BUILD_DIR)/, $(SRC_DIRS)))

.PHONY: all
all: $(PROJECT_NAME)

.PHONY: $(ALL_BUILD_DIRS)
$(ALL_BUILD_DIRS):
    @mkdir -p $@

$(BUILD_DIR)/%.o: %.cpp | $(ALL_BUILD_DIRS)
    @echo "CXX" $<
    @$(CXX) $(CXXFLAGS) -c -o $@ $<

$(PROJECT_NAME): $(CXX_TARGETS)
    @echo "CXX/LD" $@
    @$(CXX) -o $@ $^ $(LDFLAGS) $(LIB)

.PHONY: clean
clean:
    @rm -rf $(CXX_TARGETS)
    @rm -rf $(PROJECT_NAME)
    @rm -rf $(BUILD_DIR)

【问题讨论】:

    标签: c++ opencv makefile


    【解决方案1】:

    一种方法是修改下一行

    INCLUDE_DIRS := ../../third_party/opencv/include/ include
    LIBRARY_DIRS := ../../third_party/opencv/lib/ lib
    

    或者第二种不同的方法是将-I-L 选项添加到下一行

    CXXFLAGS := -std=c++11 -fopenmp -D_GLIBCXX_USE_CXX11_ABI=0 -I../../third_party/opencv/include/
    LDFLAGS := -fopenmp -Wl,-rpath,./lib -L../../third_party/opencv/lib/
    

    【讨论】:

    • emm... 好像不行。我都试过了。编译成功。但是当我检查它的依赖时,它仍然链接到系统版本。
    • @pfc 您是否尝试过从头开始重建您的项目?因为它可能重用了当前的构建选项或文件。删除所有构建临时文件。也可能是您的包含和库路径不正确。例如。也许您需要提供完整的绝对路径而不是相对路径,试试吧!因为如果您的路径不正确,那么构建系统会默默地回退到系统路径版本。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-12-23
    • 2018-11-18
    • 1970-01-01
    相关资源
    最近更新 更多