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

时间:2012-02-26 03:18:13

标签: c++ qt qmake

假设我有一个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.o namespace2_someclass.o 的东西?

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

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

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

解决名称冲突,但冗余地重复命名空间名称 - 因此再次不太可读。

为什么qmake根本没有根据源文件将目标文件放到目录结构中的选项? Qt的创造者不知道这是一个重要的特征吗?

还有一件事 - 你可以建议我使用 cmake 工具而不是 qmake ,但我看到使用cmake 要困难得多比qmake和qmake到目前为止我的工作非常出色 - 除了目标文件放置。

3 个答案:

答案 0 :(得分:13)

您可以使用以下方法将对象文件与源文件放在一起:

CONFIG += object_parallel_to_source

CONFIG += object_with_source

取决于您的qmake版本。

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

答案 1 :(得分:2)

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

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

  • 它对查找其他库的支持非常强大。您的FindXXX.cmake发布内容已附带了大量CMake个文件,因此OpenCV等“重型”文件库就像FIND_PACKAGE(OpenCV REQUIRED)一样简单。

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

总而言之,使用的构建系统(只要你的构建系统不会阻止你的软件开发)。

答案 2 :(得分:2)

根据您要构建的内容,您可以使用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:两个项目共有的配置。