【问题标题】:Qmake: Avoid file name conflicts in different folders without introducing librariesQmake:在不引入库的情况下避免不同文件夹中的文件名冲突
【发布时间】:2012-10-22 12:12:29
【问题描述】:

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

我的源代码树如下所示:

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。

【问题讨论】:

  • @NikosC。我可以为顶级文件提供一个 pro 文件,该文件将链接到其他库 + 一个顶级 SUBDIRS pro 文件,该文件将具有子目录.?这将要求我还覆盖此子目录的 .pro 文件,使其与整个应用程序的顶级 .pro 文件不同。我希望你明白我的意思。我只是想避免必须将所有顶级文件移动到物理子目录中。
  • 您应该只为foo 使用一个额外的项目文件,并为顶级目录和bar 保留现有的一个。另一种选择是符号链接冲突的文件名:ln -s bar/conflict.cpp bar/conflict_bar.cpp,然后在项目文件中使用符号链接。
  • @NikosC。谢谢,但符号链接也不是选项,因为所有生成的文件也被放入生成的 .pri 文件中以包含在某些 .pro 文件中。我目前正在完全重写构建过程以使用 SUBDIRS。我对 qmake 感到非常失望,我真的需要这样做,但我看不到更好的方法......所有其他解决方案听起来都是错误的。如果我只为foo 创建了额外的.pro,我如何告诉主要的.pro 使用它?我不能在主文件中同时使用 subdirs+app 模板,可以吗?
  • 似乎是这个的副本:stackoverflow.com/questions/7765147/…

标签: qt gnu-make qmake


【解决方案1】:

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

【讨论】:

  • 问题在于,对于生成的代码文件,还会生成一个 .pri 文件,该文件有助于将所有生成的文件绑定到实际项目。但是由于代码生成器是我编写的,我可以重写它以使用 cmake,但是,我认为这比使用 qmake 的子目录更复杂。但这对其他用户来说是一个很好的解决方案,所以你的答案很合适:)
  • 太糟糕了 ;) 那么,可能最简单的方法确实是使用子目录,可能是构建静态库,最后将它们链接在一起。
  • 是的。但是我想要一个根项目,它不是子目录项目,但仍然依赖于构建子目录......我不知道我该怎么做。
  • 我最终将 qmake SUBDIRS 与库一起使用。但是,我接受您的回答,因为它是一个不错的选择,对其他人非常有用......
猜你喜欢
  • 1970-01-01
  • 2018-08-14
  • 2022-10-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-08-13
  • 2011-09-23
  • 1970-01-01
相关资源
最近更新 更多