我有一个项目与一些文件夹碰巧包含具有相同名称的源文件.
我的源代码树看起来像这样:
project.pro
foo/
conflict.h
conflict.cpp
bar/
conflict.h
conflict.cpp
some.h
other.h
files.h
main.cpp
Run Code Online (Sandbox Code Playgroud)
默认情况下,qmake生成一个Makefile,它将生成如下构建树:
conflict.o
main.o
target
Run Code Online (Sandbox Code Playgroud)
哪里conflict.o是导致该目标文件都foo/conflict.cpp和foo/conflict.h.
我无法更改其名称,因为它们是使用外部工具生成的,强制使用不同的文件名意味着更改其内容,因此这不是一个选项.
我也不想使用qmake SUBDIRS模板,因为这意味着(1)每个子目录都是作为库单独构建的,因此整个构建过程(至少在我看来)和(2)在顶层非常复杂目录我不能有任何源文件.还是我错了?
我不能告诉qmake将目标文件写入构建目录中的单独目录吗?所以我的构建树将如下所示:
foo/
conflict.o
bar/
conflict.o
main.o
target
Run Code Online (Sandbox Code Playgroud)
或者是否有任何其他解决方案既不需要重命名源文件也不需要引入像静态库这样复杂的东西?我无法相信Qt多年来一直没有解决这个问题(在我看来很简单).(我已经在4年前解决了这个问题,但可以重命名该项目中的文件,而在这里我不能.)
如果它很重要:我在使用G ++的Ubuntu和使用mingw32的Windows上使用Qt 4.8.
你被束缚了吗qmake?如果没有,另一种选择是使用cmake。我刚刚使用简单的 CMakeLists.txt 验证了您的用例,例如
cmake_minimum_required (VERSION 2.6)
project (conflict)
add_executable(conflict foo/conflict.cpp bar/conflict.cpp main.cpp)
Run Code Online (Sandbox Code Playgroud)
其中甚至在顶级目录(main.cpp)中包含了一个源文件。这正确地构建了可执行文件 - 目标文件是在子目录中创建的,例如
./CMakeFiles/conflict.dir/main.cpp.o
./CMakeFiles/conflict.dir/bar/conflict.cpp.o
./CMakeFiles/conflict.dir/foo/conflict.cpp.o
Run Code Online (Sandbox Code Playgroud)
cmake还包括对 Qt4 的支持,自动引入所需的包含路径和库。从 qmake 迁移到 cmake 可能需要一些努力,但考虑到您的要求,我会尝试一下。
| 归档时间: |
|
| 查看次数: |
1623 次 |
| 最近记录: |