假设我有一个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.o和namespace2_someclass.o这样的东西?
是的,我可以将我的类放到一个目录中,并将它们命名为namespace1_someclass.cpp和namespace2_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
关于您可能过于复杂的担忧CMake:我一直在使用两种构建系统进行项目。虽然我同意这qmake可能更容易开始,但CMake也肯定有其优点:
它使源外构建变得非常容易。cmake <Path to source>只需在您的构建目录中执行即可。例如,当您的源位于 NFS 共享上并且您希望将对象文件放置在本地文件系统上时,这非常有用。
它对查找附加库的支持非常强大。许多FindXXX.cmake文件已经随您的CMake发行版一起提供,使得包含“重”库(OpenCV例如FIND_PACKAGE(OpenCV REQUIRED).
它甚至对Qt. 事实上,我将它用于一个更大的软件项目,其中Qt用于 GUI 部分。我们做出这样的决定是CMake因为我们需要平台独立性和多个库,而我们无法通过qmake.
总而言之,使用您熟悉的构建系统(只要您的构建系统不抑制您的软件开发)。