qmakeのプロジェクトに同じ名前のソースファイルがある場合の設定

qmake はデフォルトでは .pro の SOURCES に書かれているソースファイルをコンパイルする際に、ビルドディレクトリの直下にオブジェクトファイルを生成します。

SOURCES = a.cpp b/b.cpp c/c/c.cpp

となっている場合、ビルドディレクトリ直下に a.o, b.o, c.o が生成されます。

ほとんどのケースではこれで問題ないのですが、名前空間の利用機会の増加に伴ってたまに同じ名前のソースファイルが複数存在するような設計にすることがあります。

SOURCES = api/user/get.cpp api/user/post.cpp api/group/get.cpp api/group/post.cpp

この場合、そのままビルドをすると、ビルドディレクトリ直下の get.o が上書きされてしまい、最終的には Undefined Reference to Get::〜〜〜 のようなエラーになるでしょう。

(たまたまエラーにならなかった場合には、それはそれで問題がより深刻になりそうです。)

ということで、こういった場合には、.pro ファイルに以下の設定を追加し、ソースディレクトリのツリー構造に沿った形でビルドを行うようにしましょう。

CONFIG += object_parallel_to_source

これによってビルドディレクトリ以下に api/usr/get.o api/user/post.o api/group/get.o api/group/post.o といった形でオブジェクトファイルが生成されるようになります。