CMake 没有那个文件或目录
CMake No such file or directory
我在通过 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。
我使用的是Ubuntu20.04,cmake版本3.16.3,Qt版本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
时,第二个参数变为 binary 目录,用于生成与 db
相关的内容。因此,您可能会注意到 CMake 在您的 src/engine
目录中放置了一些构建工件,这可能不是您想要的。
要解决此问题,您必须连续调用 add_subdirectory
次以包含多个 sub-directories。
add_subdirectory(db)
add_subdirectory(engine)
我在通过 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。
我使用的是Ubuntu20.04,cmake版本3.16.3,Qt版本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
时,第二个参数变为 binary 目录,用于生成与 db
相关的内容。因此,您可能会注意到 CMake 在您的 src/engine
目录中放置了一些构建工件,这可能不是您想要的。
要解决此问题,您必须连续调用 add_subdirectory
次以包含多个 sub-directories。
add_subdirectory(db)
add_subdirectory(engine)