CMake没有这样的文件或目录

  • 本文关键字:文件 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

请不要包括与Qt创建者或Qt安装错误有关的答案。我已经检查了我的Qt安装文件夹,并且在同一目录级别上安装了Qt5Core和Qt5Sql。

我使用的是Ubuntu 20.04cmake 3.16.3版本,Qt 5.12.8

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

Qt5 Qt5Core Qt5Gui Qt5OpenGL Qt5Print支持Qt5Test Qt5XmlQt5并发Qt5DBus Qt5网络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相关的生成内容的二进制目录。因此,您可能会注意到CMake在src/engine目录中放置了一些构建工件,这可能不是您想要的。

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

add_subdirectory(db)
add_subdirectory(engine)

相关内容

  • 没有找到相关文章

最新更新