Qmake:在不引入库的情况下避免在不同文件夹中发生文件名冲突

时间:2012-11-01 20:31:19

标签: qt gnu-make qmake

我有一个项目,其中包含一些恰好包含相同名称的源文件的文件夹。

我的源代码树如下所示:

project.pro

foo/
    conflict.h
    conflict.cpp

bar/
    conflict.h
    conflict.cpp

some.h
other.h
files.h
main.cpp

默认情况下,qmake生成一个Makefile,它将生成如下构建树:

conflict.o
main.o
target

conflict.o foo/conflict.cppfoo/conflict.h 的目标文件。

我不能更改名称,因为它们是使用外部工具生成的,并且强制使用不同的文件名意味着更改其内容,因此这不是一个选项。

我也不想使用qmake SUBDIRS 模板,因为这意味着(1)每个子目录都是作为库单独构建的,因此整个构建过程非常复杂(至少在我看来)和(2)在顶级目录中我不能有任何源文件。或者我错了吗?

我不能告诉qmake将目标文件写入构建目录中的单独目录吗?所以我的构建树将如下所示:

foo/
    conflict.o

bar/
    conflict.o

main.o
target

或者是否有任何其他解决方案既不需要重命名源文件也不需要引入像静态库那样复杂的东西?我无法相信Qt多年来一直没有解决这个问题(在我看来很简单)。 (我已经在4年前解决了这个问题,但可以重命名该项目中的文件,而在这里我不能。)

如果它很重要:我在使用G ++的Ubuntu和使用mingw32的Windows上使用Qt 4.8。

1 个答案:

答案 0 :(得分:2)

您是否与qmake绑定?如果没有,替代方案可以是使用cmake。我刚刚用一个简单的CMakeLists.txt验证了你的用例,比如

cmake_minimum_required (VERSION 2.6)
project (conflict)
add_executable(conflict foo/conflict.cpp bar/conflict.cpp main.cpp)

甚至包括顶级目录(main.cpp)中的源文件。这正确地构建了可执行文件 - 目标文件在子目录中创建,如

./CMakeFiles/conflict.dir/main.cpp.o
./CMakeFiles/conflict.dir/bar/conflict.cpp.o
./CMakeFiles/conflict.dir/foo/conflict.cpp.o

cmake还包括对Qt4的支持,以自动引入所需的包含路径和库。可能需要一些努力才能从qmake迁移到cmake,但考虑到你的要求,我会尝试一下。