7

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

我的源代码树如下所示:

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

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

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

我不能告诉 qmake 将目标文件写入构建目录中的单独目录吗?所以我的构建树看起来像这样:

foo/
    conflict.o

bar/
    conflict.o

main.o
target

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

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

4

1 回答 1

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 可能需要一些努力,但考虑到您的要求,我会尝试一下。

于 2012-11-01T21:38:05.613 回答