“找不到 -l <​​目录>”错误 - CMake

Posted

技术标签:

【中文标题】“找不到 -l <​​目录>”错误 - CMake【英文标题】:"Cannot find -l<directory>" error - CMake 【发布时间】:2020-06-13 12:40:49 【问题描述】:

我的程序包含一个子目录,因为那里需要一个头文件和一个源文件。我的项目如下所示:

编辑:也许我没有指定:我的目标是将 frame_cap.cpp 链接到头文件 grab_cut.h,因为我需要它的功能。

[-] raspicam
 |  [-] main_folder
 |       frame_cap.cpp
 |       CMakeLists.txt
 |       [-] opencv-plus
 |            grab_cut.cpp
 |            grab_cut.h
 |            CMakeLists.txt

现在,我已经使用 main_folder 中的 CMakeLists.txt 将两者链接起来。它看起来如下:

CMAKE_MINIMUM_REQUIRED(VERSION 2.8)
PROJECT(frame_cap)

SET(OpenCVPLUS_DIR "/home/pi/Desktop/raspicam/main_folder/opencv-plus")

FIND_PACKAGE( OpenCV REQUIRED )
SET(OpenCV_PACKAGE $OpenCV_LIBRARIES)

INCLUDE_DIRECTORIES( $OpenCV_INCLUDE_DIRS )
INCLUDE_DIRECTORIES($OpenCVPLUS_DIR)

LINK_DIRECTORIES($OpenCVPLUS_DIR)

ADD_SUBDIRECTORY($OpenCVPLUS_DIR)

ADD_EXECUTABLE( frame_cap frame_cap.cpp )
TARGET_LINK_LIBRARIES( frame_cap $OpenCV_LIBS $OpenCVPLUS_DIR)

如您所见,OpenCVPLUS_DIR 是 opencv-plus 目录,其中包含头文件和源文件。 opencv-plus文件夹中的CMakeLists.txt文件如下:

CMAKE_MINIMUM_REQUIRED(VERSION 2.8)
PROJECT(grab_cut)

SET(OpenCVPLUS_DIR "/home/pi/Desktop/raspicam/main_folder/opencv-plus")
FIND_PACKAGE(OpenCV REQUIRED)

INCLUDE_DIRECTORIES($OpenCV_INCLUDE_DIRS)
SET(SOURCES grab_cut.cpp $OpenCVPLUS_DIR/grab_cut.h)

ADD_EXECUTABLE(grab_cut grab_cut.cpp $SOURCES)
TARGET_LINK_LIBRARIES(grab_cut $OpenCV_LIBS)

最后,这是我得到的确切错误:

[ 25%] Linking CXX executable frame_cap
/usr/bin/ld: cannot find -lraspicam/main_folder/opencv-plus/
collect2: error: ld returned 1 exit status
make[2]: *** [CMakeFiles/frame_cap.dir/build.make:102: frame_cap] Error 1
make[1]: *** [CMakeFiles/Makefile2:73: CMakeFiles/frame_cap.dir/all] Error 2
make: *** [Makefile:84: all] Error 2

我很高兴听到您的建议,因为我是 CMake 的新手,并且不确定自己做错了什么。

【问题讨论】:

欢迎来到 Stack Overflow!这里有很多代码可以清理,但有一个问题。你为什么要link一个可执行文件到另一个?你打算让frame_capgrab_cut both 成为可执行文件吗?还是应该将其构建为,然后链接到您的可执行文件? 嘿@squareskittles,我已经尽可能小心地处理代码,因为我并不总是确定什么是正确的,它看起来很糟糕,我同意。关于可执行文件:我认为添加grab_cut 可执行文件对于它的CMakeLists.txt 文件实际工作是必要的。我真正打算做的是将frame_cap.cpp 链接到标题grab_cut.h。所以我想这意味着应该链接grab_cut可执行文件。 您可以创建这两个可执行文件,也可以使用grab_cut 标头作为frame_cap.cpp 中的包含文件。那是你的意图吗?需要明确的是,头文件本身并没有链接。它们包含在库或可执行文件的编译中。 是的,我就是这个意思 【参考方案1】:

错误:

/usr/bin/ld: cannot find -lraspicam/main_folder/opencv-plus/

发生是因为您尝试在此处将目录链接到您的frame_cap 可执行文件:

TARGET_LINK_LIBRARIES( frame_cap $OpenCV_LIBS $OpenCVPLUS_DIR)

这没有意义;只有 应该链接到您的可执行文件。

从您的 cmets 看来,您似乎想要构建两个可执行文件,但在两者中都使用了 grab_cut 函数。这当然可以通过 CMake 实现。但是您似乎有一个设计问题,因为使用frame_cap 可执行文件编译grab_cut.cpp 文件可能会导致问题,假设两个文件都包含main 函数。您需要将main 函数拆分 到一个单独的文件中(例如main.cpp),然后您可以将grab_cut.cpp 包含在两个可执行文件的编译中。

顺便说一句,您可以使用CMAKE_CURRENT_LIST_DIR 来引用当前 CMakeLists.txt 文件的目录,因此无需在源代码树中明确列出目录。另外,我祈祷您使用的是比 2.8 版更新的 CMake。您的 CMake 文件中的某些步骤似乎没有必要,因此这里有一些可能适合您的简化文件。

CMAKE_MINIMUM_REQUIRED(VERSION 2.8)
PROJECT(frame_cap)
# There is no need to spell out this directory since it exists 
# in the source-tree already.
SET(OpenCVPLUS_DIR "/home/pi/Desktop/raspicam/main_folder/opencv-plus")
FIND_PACKAGE( OpenCV REQUIRED )
# Seems unused, remove it.
SET(OpenCV_PACKAGE $OpenCV_LIBRARIES)
# Include the OpenCV and opencv-plus headers in this executable.
INCLUDE_DIRECTORIES($OpenCV_INCLUDE_DIRS $CMAKE_CURRENT_LIST_DIR/opencv-plus)
# There is no library to link from this directory, so we don't need this call.
LINK_DIRECTORIES($OpenCVPLUS_DIR)
ADD_SUBDIRECTORY(opencv-plus) 
# Add the grap_cut.cpp file to the frame_cap executable.
ADD_EXECUTABLE( frame_cap frame_cap.cpp opencv-plus/grab_cut.cpp)
# We don't link anything from opencv-plus, we compiling it directly.
TARGET_LINK_LIBRARIES( frame_cap $OpenCV_LIBS $OpenCVPLUS_DIR)

您的opencv-plus/CMakeLists.txt 文件可以简化为:

# If this CMake file is always called as part of the top-level CMake 
# file, don't need this.
CMAKE_MINIMUM_REQUIRED(VERSION 2.8)
PROJECT(grab_cut)
# Don't need this, as explained earlier.
SET(OpenCVPLUS_DIR "/home/pi/Desktop/raspicam/main_folder/opencv-plus")
# The top-level CMake file already found OpenCV, so the variables 
# we need are already defined.
FIND_PACKAGE(OpenCV REQUIRED)
# The include directories get initialized from the parent CMake file, so no need 
# for this call if the include directories are the same for both executables.
INCLUDE_DIRECTORIES($OpenCV_INCLUDE_DIRS)
# Separate 'main' function into separate file, and add it here.
SET(SOURCES grab_cut.cpp grab_cut.h main.cpp)
# Don't need to add 'grab_cut.cpp' to the executable twice! It was 
# already added using the 'SOURCES' variable.
ADD_EXECUTABLE(grab_cut grab_cut.cpp $SOURCES)
TARGET_LINK_LIBRARIES(grab_cut $OpenCV_LIBS)

【讨论】:

您好,谢谢您的回答。我实现了你告诉我的所有内容,但现在我似乎收到了“未定义的参考错误”,这些错误太长了,无法在此处发布。似乎grab_cut 文件仍然无法被识别? @RaresTudor 好的,听起来您有一个更基本的设计问题,我最初从您的帖子中无法理解。看来您需要将grab_cut 分成grab_cut.cpp 和main.cpp。这样,main函数可以放在main.cpp中,grab_cut函数放在grab_cut.cpp中。然后,grab_cut.cpp 应该列在对add_executable 的两个调用中。 @RaresTudor 我根据您的反馈修改了我的回复,并澄清了我之前的评论。对之前的误会深表歉意,希望对您有所帮助! 非常感谢,现在一切正常。 @squareskittles

以上是关于“找不到 -l <​​目录>”错误 - CMake的主要内容,如果未能解决你的问题,请参考以下文章

Pig 安装错误:错误 pig.Main:错误 2998:未处理的内部错误

Informix 错误:发生了语法错误。错误代码:-201

我收到一个错误:“MetaMask - RPC 错误:错误:错误:[ethjs-rpc] rpc 错误与有效负载”

错误精灵错误跟踪器错误

网页打开显示错误500是啥意思

PHP错误处理