假设我有一个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中项目资源管理器中的源文件时造成很小的不便,因为当有很多源文件时在项目中,它的可读性远远低于 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 回答
您可以使用以下命令将对象文件放在源文件旁边:
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共享上时,这很好,并且您希望将目标文件放在本地文件系统上 .它对查找其他库的支持非常强大 . 您的
CMake
发行版已附带了大量FindXXX.cmake
文件,因此OpenCV
包含的"heavy"库就像FIND_PACKAGE(OpenCV REQUIRED)
一样简单 .它甚至对
Qt
提供了开箱即用的支持 . 事实上,我将它用于一个更大的软件项目,其中Qt
用于GUI部分 . 我们决定CMake
因为我们需要平台独立性和多个库,我们无法通过qmake
轻松添加 .总而言之,使用构建系统 you 很舒服(只要您的构建系统不会阻止您的软件开发) .
根据您要构建的内容,您可以在qmake中使用
subdirs
模板来执行此操作 . 您需要在每个namespace
目录中放置一个项目文件,在此目录中,您可以为目标文件指定不同的输出目录 .main.pro
:n1.pro
和n2.pro
:common.pri
:两个项目共有的配置 .