我在通过 cmake 构建 Qt5 项目时遇到问题。
\ncmake .. && make 我从目录运行命令build并收到以下错误:
/usr/bin/ld: cannot find -lengine-lib\ncollect2: error: ld returned 1 exit status\nmake[2]: *** [src/CMakeFiles/blacklist-engine-cli.dir/build.make:102: src/blacklist-engine-cli] Error 1\nmake[1]: *** [CMakeFiles/Makefile2:117: src/CMakeFiles/blacklist-engine-cli.dir/all] Error 2\nmake: *** [Makefile:84: all] Error 2\nRun Code Online (Sandbox Code Playgroud)\n我已经简要搜索了这个主题,但是当我在没有 Qt5Sql 的情况下运行这个项目时,仅使用 Qt5Core 构建该项目没有任何问题。为了在没有 Qt5Sql 的情况下构建项目,我只需删除该db文件夹,并删除其他 CMakeLists.txt 文件中引用该文件夹的行。我的问题是:
为什么如果我只想包含 Qt5Core 它可以工作,为什么当我还包含 Qt5Sql 时它不起作用?我做错了什么,包括 Qt5Sql?
\n请不要包含与 QtCreator 或 Qt 安装错误相关的答案。我检查了我的 Qt 安装文件夹,并且在同一目录级别安装了 Qt5Core 和 Qt5Sql。
\n我使用的是Ubuntu 20.04,cmake版本3.16.3,Qt版本5.12.8
\nls /usr/lib/x86_64-linux-gnu/cmake
\n\nQt5 Qt5Core Qt5Gui Qt5OpenGL Qt5PrintSupport Qt5Test Qt5Xml\nQt5Concurrent Qt5DBus Qt5Network Qt5OpenGLExtensions Qt5Sql Qt5Widgets
\n
我的项目中有以下结构:
\nroot\n\xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 CMakeModules\n\xe2\x94\x82 \xe2\x94\x94\xe2\x94\x80\xe2\x94\x80 Qt.cmake\n\xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 build\n\xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 src\n\xe2\x94\x82 \xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 db\n\xe2\x94\x82 \xe2\x94\x82 \xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 dbmanager.cpp\n\xe2\x94\x82 \xe2\x94\x82 \xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 dbmanager.h\n\xe2\x94\x82 \xe2\x94\x82 \xe2\x94\x94\xe2\x94\x80\xe2\x94\x80 CMakeLists.txt\n\xe2\x94\x82 \xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 engine\n\xe2\x94\x82 \xe2\x94\x82 \xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 scanner.cpp\n\xe2\x94\x82 \xe2\x94\x82 \xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 scanner.h\n\xe2\x94\x82 \xe2\x94\x82 \xe2\x94\x94\xe2\x94\x80\xe2\x94\x80 CMakeLists.txt\n\xe2\x94\x82 \xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 CMakeLists.txt\n\xe2\x94\x82 \xe2\x94\x94\xe2\x94\x80\xe2\x94\x80 main.cpp\n\xe2\x94\x94\xe2\x94\x80\xe2\x94\x80 CMakeLists.txt\nRun Code Online (Sandbox Code Playgroud)\nCMakeLists.txt:
\ncmake_minimum_required(VERSION 3.0)\n\nproject(blacklist-engine)\n\nset(CMAKE_CXX_STANDARD 11)\nset(CMAKE_CXX_STANDARD_REQUIRED ON)\n\nlist(APPEND CMAKE_MODULE_PATH ${CMAKE_SOURCE_DIR}/CMakeModules)\n\nadd_subdirectory(src)\nRun Code Online (Sandbox Code Playgroud)\nCMakeModules/Qt.cmake:
\nset(CMAKE_AUTOMOC ON)\n\nfind_package(Qt5 REQUIRED COMPONENTS Core Sql)\nRun Code Online (Sandbox Code Playgroud)\nsrc/CMakeLists.txt:
\ninclude(Qt)\n\nadd_subdirectory(\n db \n engine\n)\n\nadd_executable(blacklist-engine-cli main.cpp)\n\ntarget_link_libraries(\n blacklist-engine-cli\n Qt5::Core\n Qt5::Sql\n engine-lib\n db-lib\n)\nRun Code Online (Sandbox Code Playgroud)\nsrc/main.cpp:
\n#include <QtCore>\n\n#include "db/dbmanager.h"\n#include "engine/scanner.h"\n...\nRun Code Online (Sandbox Code Playgroud)\nsrc/db/CMakeLists.txt(已更新):
\nset (db-lib-source\n dbmanager.h\n dbmanager.cpp\n)\n\nadd_library(db-lib ${db-lib-source})\n\ntarget_link_libraries(\n db-lib\n Qt5::Sql \n)\nRun Code Online (Sandbox Code Playgroud)\nsrc/db/dbmanager.h:
\n#include <QtSql/QSqlDatabase>\n...\nRun Code Online (Sandbox Code Playgroud)\nsrc/db/dbmanager.cpp:
\n#include "dbmanager.h"\n\n#include <QtSql/QSqlQuery>\n...\nRun Code Online (Sandbox Code Playgroud)\nsrc/engine/CMakeLists.txt:
\nset(engine-lib-source\n scanner.h\n scanner.cpp\n)\n\nadd_library(engine-lib ${engine-lib-source})\nRun Code Online (Sandbox Code Playgroud)\nsrc/engine/scanner.h:
\n#include <QtCore>\n...\nRun Code Online (Sandbox Code Playgroud)\nsrc/engine/scanner.cpp:
\n#include "scanner.h"\n...\nRun Code Online (Sandbox Code Playgroud)\n
错误的原因是因为engine-lib从未构建过,并且其 CMake 文件甚至从未被处理过。CMake 文件中的违规行是这一行:
add_subdirectory(
db
engine
)
Run Code Online (Sandbox Code Playgroud)
当以add_subdirectory这种方式使用时,第二个参数将成为生成的与 相关的内容的二进制db目录。因此,您可能会注意到 CMake 在您的src/engine目录中放置了一些构建工件,这可能不是您想要的。
要解决此问题,您必须add_subdirectory连续调用多次以包含多个子目录。
add_subdirectory(db)
add_subdirectory(engine)
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
20279 次 |
| 最近记录: |