首页 文章

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

提问于
浏览
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.oboth foo/conflict.cpp and foo/conflict.h 的目标文件 .

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

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

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

foo/
    conflict.o

bar/
    conflict.o

main.o
target

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

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

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

相关问题