首页 文章

为什么qmake将所有对象(.o)文件放在一个目录中?

提问于
浏览
24

假设我有一个Qt应用程序,我在两个不同的命名空间中有两个具有相同名称的类:

namespace namespace1
{
    class SomeClass;
}

namespace namespace2
{
    class SomeClass;
}

我根据它有一个项目目录结构:

-->src/
  -->namespace1/
    -->someclass.cpp
  -->namespace2/
    -->someclass.cpp

当我用qmake编译应用程序时,它将所有对象(.o)文件放到一个目录中 - 所以它首先创建 someclass.o 文件然后用第二个 someclass.o 重写它 - 这是一个名称冲突,所以它很糟糕 .

为什么qmake没有考虑源文件的目录结构,为什么它不能创建类似 namespace1_someclass.onamespace2_someclass.o 的东西?

是的,我可以将我的类放到一个目录中,并将它们命名为 namespace1_someclass.cppnamespace2_someclass.cpp ,并且不会发生名称冲突,但这会在查看Qt Creator中项目资源管理器中的源文件时造成很小的不便,因为当有很多源文件时在项目中,它的可读性远远低于 the directory structure ,我可以展开或折叠 .

另一个极端是拥有如下目录结构:

-->src/
  -->namespace1/
    -->namespace1_someclass.cpp
  -->namespace2/
    -->namespace2_someclass.cpp

它解决了名称冲突,但它命名空间名称 - 因此再次不太可读 .

为什么qmake至少没有 an option to put the object files to the directory structure according to the source files ? Qt的创造者不知道这是一个重要的特征吗?

还有一件事 - 你可以建议我使用 cmake 工具而不是 qmake 但我看到使用cmake much much much more difficult 而不是qmake和qmake到目前为止我的工作非常好 - 除了目标文件放置 .

3 回答

  • 2

    您可以使用以下命令将对象文件放在源文件旁边:

    CONFIG += object_parallel_to_source

    要么

    CONFIG += object_with_source

    取决于你的qmake版本 .

    资料来源:https://wiki.qt.io/Undocumented_QMake#Config_features

  • 2

    关于你担心 CMake 可能太复杂了:我一直在使用这两个构建系统的项目 . 虽然我同意 qmake 可能更容易开始,但 CMake 肯定也有它的优点:

    • 它使源外构建变得非常容易 . 只需在构建目录中执行 cmake <Path to source> 即可 . 例如,当您的源位于NFS共享上时,这很好,并且您希望将目标文件放在本地文件系统上 .

    • 它对查找其他库的支持非常强大 . 您的 CMake 发行版已附带了大量 FindXXX.cmake 文件,因此 OpenCV 包含的"heavy"库就像 FIND_PACKAGE(OpenCV REQUIRED) 一样简单 .

    • 它甚至对 Qt 提供了开箱即用的支持 . 事实上,我将它用于一个更大的软件项目,其中 Qt 用于GUI部分 . 我们决定 CMake 因为我们需要平台独立性和多个库,我们无法通过 qmake 轻松添加 .

    总而言之,使用构建系统 you 很舒服(只要您的构建系统不会阻止您的软件开发) .

  • 13

    根据您要构建的内容,您可以在qmake中使用 subdirs 模板来执行此操作 . 您需要在每个 namespace 目录中放置一个项目文件,在此目录中,您可以为目标文件指定不同的输出目录 .

    -->src/main.pro
      -->namespace1/n1.pro
        -->someclass.cpp
      -->namespace2/n2.pro
        -->someclass.cpp
    

    main.pro

    TEMPLATE = subdirs
    SUBDIRS  = namespace1 namespace2
    

    n1.pron2.pro

    include("../common.pri")
    OBJECTS_DIR = $${PWD}
    TARGET = some_target
    TEMPLATE = some_qmake_template
    

    common.pri :两个项目共有的配置 .

相关问题