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

Pet*_*vák 24 c++ qt qmake

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

namespace namespace1
{
    class SomeClass;
}

namespace namespace2
{
    class SomeClass;
}
Run Code Online (Sandbox Code Playgroud)

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

-->src/
  -->namespace1/
    -->someclass.cpp
  -->namespace2/
    -->someclass.cpp
Run Code Online (Sandbox Code Playgroud)

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

为什么qmake没有考虑源文件的目录结构?为什么它不会创建像namespace1_someclass.onamespace2_someclass.o这样的东西?

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

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

-->src/
  -->namespace1/
    -->namespace1_someclass.cpp
  -->namespace2/
    -->namespace2_someclass.cpp
Run Code Online (Sandbox Code Playgroud)

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

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

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

max*_*max 13

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

CONFIG += object_parallel_to_source

要么

CONFIG += object_with_source

取决于你的qmake版本.

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


Gno*_*lon 2

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

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

  • 它对查找附加库的支持非常强大。许多FindXXX.cmake文件已经随您的CMake发行版一起提供,使得包含“重”库(OpenCV例如FIND_PACKAGE(OpenCV REQUIRED).

  • 它甚至对Qt. 事实上,我将它用于一个更大的软件项目,其中Qt用于 GUI 部分。我们做出这样的决定是CMake因为我们需要平台独立性和多个库,而我们无法通过qmake.

总而言之,使用熟悉的构建系统(只要您的构建系统不抑制您的软件开发)。