c++ - CMake 没有那个文件或目录

标签 c++ cmake qt5

我在通过 cmake 构建 Qt5 项目时遇到问题。

我从目录 build 运行命令 cmake .. && make 并收到以下错误:

/usr/bin/ld: cannot find -lengine-lib
collect2: error: ld returned 1 exit status
make[2]: *** [src/CMakeFiles/blacklist-engine-cli.dir/build.make:102: src/blacklist-engine-cli] Error 1
make[1]: *** [CMakeFiles/Makefile2:117: src/CMakeFiles/blacklist-engine-cli.dir/all] Error 2
make: *** [Makefile:84: all] Error 2

我已经简要搜索了这个主题,但是当我在没有 Qt5Sql 的情况下运行这个项目时,只使用 Qt5Core 我在构建项目时完全没有问题。为了在没有 Qt5Sql 的情况下构建项目,我只需要删除 db 文件夹,并删除在我的其他 CMakeLists.txt 文件中引用该文件夹的行。我的问题是:

如果我只想包含 Qt5Core 为什么它可以工作,为什么当我还包含 Qt5Sql 时它不工作?我做错了什么,包括 Qt5Sql?

请不要包含与 QtCreator 或 Qt 安装错误相关的答案。我检查了我的 Qt 安装文件夹,我在同一目录级别安装了 Qt5Core 和 Qt5Sql。

我正在使用 Ubuntu 20.04cmake 版本 3.16.3Qt 版本 5.12.8

ls/usr/lib/x86_64-linux-gnu/cmake

Qt5 Qt5Core Qt5Gui Qt5OpenGL Qt5PrintSupport Qt5Test Qt5Xml Qt5Concurrent Qt5DBus Qt5Network Qt5OpenGLExtensions Qt5Sql Qt5Widgets

我的项目结构如下:

root
├── CMakeModules
│   └── Qt.cmake
├── build
├── src
│   ├── db
│   │    ├── dbmanager.cpp
│   │    ├── dbmanager.h
│   │    └── CMakeLists.txt
│   ├── engine
│   │    ├── scanner.cpp
│   │    ├── scanner.h
│   │    └── CMakeLists.txt
│   ├── CMakeLists.txt
│   └── main.cpp
└── CMakeLists.txt

CMakeLists.txt:

cmake_minimum_required(VERSION 3.0)

project(blacklist-engine)

set(CMAKE_CXX_STANDARD 11)
set(CMAKE_CXX_STANDARD_REQUIRED ON)

list(APPEND CMAKE_MODULE_PATH ${CMAKE_SOURCE_DIR}/CMakeModules)

add_subdirectory(src)

CMakeModules/Qt.cmake:

set(CMAKE_AUTOMOC ON)

find_package(Qt5 REQUIRED COMPONENTS Core Sql)

src/CMakeLists.txt:

include(Qt)

add_subdirectory(
    db   
    engine
)

add_executable(blacklist-engine-cli main.cpp)

target_link_libraries(
    blacklist-engine-cli
    Qt5::Core
    Qt5::Sql
    engine-lib
    db-lib
)

src/main.cpp:

#include <QtCore>

#include "db/dbmanager.h"
#include "engine/scanner.h"
...

src/db/CMakeLists.txt(已更新):

set (db-lib-source
    dbmanager.h
    dbmanager.cpp
)

add_library(db-lib ${db-lib-source})

target_link_libraries(
    db-lib
    Qt5::Sql    
)

src/db/dbmanager.h:

#include <QtSql/QSqlDatabase>
...

src/db/dbmanager.cpp:

#include "dbmanager.h"

#include <QtSql/QSqlQuery>
...

src/engine/CMakeLists.txt:

set(engine-lib-source
    scanner.h
    scanner.cpp
)

add_library(engine-lib ${engine-lib-source})

src/engine/scanner.h:

#include <QtCore>
...

src/engine/scanner.cpp:

#include "scanner.h"
...

最佳答案

错误的原因是因为 engine-lib 从未构建过,甚至从未处理过它的 CMake 文件。您的 CMake 文件中有问题的行是这一行:

add_subdirectory(
    db   
    engine
)

使用 add_subdirectory 时以这种方式,第二个参数成为与 db 相关的生成内容的 binary 目录。因此,您可能会注意到 CMake 在您的 src/engine 目录中放置了一些构建工件,这可能不是您想要的。

要解决此问题,您必须连续调用 add_subdirectory 以包含多个子目录。

add_subdirectory(db)
add_subdirectory(engine)

关于c++ - CMake 没有那个文件或目录,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63325816/

相关文章:

windows - Qt Creator 使用带有 CMake 的 MinGW 编译器

无法在 VS 2019 上以 Release模式为 SDL 库构建解决方案

c++ - 使用 Qt3D 2.0 的广告牌

c++ - 在长时间处理期间与 GUI 交互

windows - 如何使用 mingw 启用 tbb 安装 opencv

c++ - C中UDP服务器和客户端的问题

c++ - 部署带有标识的Qt程序加载

c++ - 具有固定纵横比的透视图(1 :1) in OpenGL and Qt5 (QGLWidget)

c++ - 类变量在函数完成后重置

c++ - Makefiles,从 VC6 迁移到 Visual Studio 2010