假设我有一个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到目前为止我的工作非常出色 - 除了目标文件放置。
答案 0 :(得分:13)
您可以使用以下方法将对象文件与源文件放在一起:
CONFIG += object_parallel_to_source
或
CONFIG += object_with_source
取决于您的qmake版本。
答案 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.pro
和n2.pro
:
include("../common.pri")
OBJECTS_DIR = $${PWD}
TARGET = some_target
TEMPLATE = some_qmake_template
common.pri
:两个项目共有的配置。