从 QMake 到 CMake。 (不同的路径级别)

Posted

技术标签:

【中文标题】从 QMake 到 CMake。 (不同的路径级别)【英文标题】:From QMake to CMake. (Different path levels) 【发布时间】:2021-02-25 12:43:24 【问题描述】:

我正在尝试将多级项目从 QMake 移植到 CMake。 (我试着先做一个简单的例子)

下面显示我想要的结构:

根 CMakeLists.txt 的位置比 main 和 lib 之前的路径级别是必需的

├── CMakeLists.txt
├── app02
│   ├── CMakeLists.txt
│   └── main.cpp
└── lib
    ├── CMakeLists.txt
    ├── myprint.cpp
    └── myprint.h

根CMakeLists.txt是这么写的:

cmake_minimum_required(VERSION 3.13)

set(CMAKE_PROJECT_NAME "testProject")
project($CMAKE_PROJECT_NAME)

list(APPEND CMAKE_PREFIX_PATH "/home/enigma/Qt/5.15.2/gcc_64")

set(CMAKE_CXX_STANDARD 17)
set(CMAKE_CXX_STANDARD_REQUIRED ON)

set(CMAKE_AUTOMOC ON)
set(CMAKE_INCLUDE_CURRENT_DIR ON)

find_package(Qt5Widgets REQUIRED)
set(QT5_LIBRARIES Qt5::Widgets)

add_subdirectory(lib app02)

set(TARGET "app02Build")
add_executable($TARGET $SOURCES)

target_link_libraries($TARGET thePrintLibrary $QT5_LIBRARIES)

app002路径中的main.cpp是这样写的:

#include "../lib/myprint.h"

int main(int argc, char *argv[])

    myPrint::print("This the second App");

这里是它对应的 CMakeLists.txt:

cmake_minimum_required(VERSION 3.13)

set(SOURCES
    main.cpp
)

lib 路径包含下一个文件:

myprint.h

#ifndef MYPRINT_H
#define MYPRINT_H

#include <QDebug>
#include <string>

class myPrint

public:
    static void print(std::string toPrint) 
        qDebug() << toPrint.c_str();
    
;

#endif // MYPRINT_H

myPrint.cpp

#include "myprint.h"
//yes, there is no more code :-)

以及对应的CMakeLists.txt

cmake_minimum_required(VERSION 3.13)
    
add_library( 
    thePrintLibrary
    myprint.h
    myprint.cpp
)

CMake 预扫描运行良好,但是当我编译时出现下一个错误:

[ 28%] Building CXX object app02/CMakeFiles/thePrintLibrary.dir/myprint.cpp.o
In file included from /home/enigma/APD_Programas/Port/test/lib/myprint.cpp:1:
/home/enigma/APD_Programas/Port/test/lib/myprint.h:4:10: fatal error: QDebug: No such file or directory
 #include <QDebug>
          ^~~~~~~~
compilation terminated.
gmake[2]: *** [app02/CMakeFiles/thePrintLibrary.dir/build.make:63: app02/CMakeFiles/thePrintLibrary.dir/myprint.cpp.o] Error 1
gmake[1]: *** [CMakeFiles/Makefile2:162: app02/CMakeFiles/thePrintLibrary.dir/all] Error 2
gmake: *** [Makefile:84: all] Error 2

有人这么好心来帮助我吗?

提前致谢

【问题讨论】:

我认为除了Qt5::Widgets之外你还需要Qt5::Core 谢谢,我做到了,但不要改变结果:-( 【参考方案1】:

drescherjm 在评论中是否说过,您的 target_link_libraries 中缺少 Qt5::Core

先添加:

find_package(Qt5Core REQUIRED)

然后替换:

target_link_libraries($TARGET thePrintLibrary $QT5_LIBRARIES)

通过

target_link_libraries($TARGET thePrintLibrary $QT5_LIBRARIES Qt5::Core)

或替换

set(QT5_LIBRARIES Qt5::Widgets)

通过

set(QT5_LIBRARIES Qt5::Widgets Qt5::Core)

【讨论】:

我认为你还需要一个用于 Qt5Core 的 find_package() 您好,谢谢。我不知道为什么我的答案比你的高,我是论坛的新人。非常感谢,我做到了,但我得到了同样的错误:-( 你添加了'find_package(Qt5Core REQUIRED)'这一行吗? 我添加了:find_package(Qt5 REQUIRED COMPONENTS Widgets Core) set(QT5_LIBRARIES Qt5::Core Qt5::Widgets) .... 产生同样的错误 :-(【参考方案2】:

谢谢你们,

但是当我替换以下行时:

find_package(Qt5 REQUIRED COMPONENTS Widgets Core)
set(QT5_LIBRARIES Qt5::Core Qt5::Widgets)

我变成了同样的错误:-(

[ 28%] Building CXX object app02/CMakeFiles/thePrintLibrary.dir/myprint.cpp.o
In file included from /home/enigma/APD_Programas/Port/test/lib/myprint.cpp:1:
/home/enigma/APD_Programas/Port/test/lib/myprint.h:4:10: fatal error: QDebug: No such file or directory
 #include <QDebug>

我也尝试添加下一句:(因为我怀疑库没有直接链接到 Qt)

target_link_libraries(thePrintLibrary $QT5_LIBRARIES)

然后我在最终链接中遇到下一个奇怪的错误:

[100%] Linking CXX executable app02Build
/usr/bin/ld: /usr/lib/gcc/x86_64-linux-gnu/8/../../../x86_64-linux-gnu/Scrt1.o: in function `_start':
(.text+0x20): undefined reference to `main'
collect2: error: ld returned 1 exit status
gmake[2]: *** [CMakeFiles/app02Build.dir/build.make:88: app02Build] Error 1
gmake[1]: *** [CMakeFiles/Makefile2:74: CMakeFiles/app02Build.dir/all] Error 2
gmake: *** [Makefile:84: all] Error 2

【讨论】:

当您提供的答案应该是问题的解决方案时,您不应该提出问题。相反,如果它与原始问题不同,您可能需要提出一个全新的问题。无论哪种情况,都很难提供帮助,因为您没有小例子。您可以使用仅包含单个文件和 int main() 的单个 CMakeLists.txt 来演示问题的小型 Qt 程序重现原始问题的错误。 (.text+0x20): undefined reference to main'` 是包含源中列出的int main() 的文件。我认为您缺少 add_subdirectory() 用于将 main.cpp 添加到 SOURCES 的 CMakeLists.txt 文件的位置 我是论坛的新手,有点困惑,请原谅。我对一个简单的文件没有问题。问题出在那个树形结构上。我已经编写了所有文件的代码。不知道能不能在论坛里附个.zip和代码,所以这里是:easyupload.io/k4wc8a【参考方案3】:

谢谢大家, 在你的帮助下,我发现了最后一个失败。

在那个路径分布中,我必须在 add_executable 中提供完整的主路径。

add_executable($TARGET app02/main.cpp)

也许有更好的解决方案,所以,如果有人想添加一些东西, 拜托,你很高兴

【讨论】:

以上是关于从 QMake 到 CMake。 (不同的路径级别)的主要内容,如果未能解决你的问题,请参考以下文章

使用 cmake 部署 QtCreator

CMake 路径中的错误

浅谈 qmake 之 shadow build(就是将源码路径和构建路径分开)

cmake nmake qmake 的区别联系

Qt之QMake编译转换为CMake编译

make如何指定cmake路径