Как использовать qmake с двумя исходными файлами с одинаковыми именами? - PullRequest
16 голосов
/ 14 октября 2011

Мой проект Qt имеет два исходных файла с одинаковым именем, но в другой папке. Про файл:

SOURCES = A/Test.cpp 
SOURCES += B/Test.cpp

Может генерировать файл решения Visual Studio с помощью дополнения Qt Visual Studio, но он не будет работать, поскольку сгенерированный объектный файл имеет то же имя: Test.obj. Это вызовет LNK2001 неразрешенный внешний символ , потому что один из Test.obj перезаписан.

Как написать правильный файл pro, чтобы справиться с этим?

Ответы [ 4 ]

15 голосов
/ 14 октября 2011

Вы можете попробовать добавить эту строку в ваш файл .pro:

CONFIG += object_with_source

Но, как следует из названия опции, файлы .obj не будут создаваться в теневой сборке вне источника / ""directory.

Эта опция была заменена на object_parallel_to_source в Qt 5, которая должна работать с теневым зданием.

4 голосов
/ 14 октября 2011

Вы должны рассмотреть возможность разделения вашего решения на несколько проектов, но это зависит от того, может ли каждая из этих папок представлять проект по-своему. Если вы выберете это решение, вам придется написать один .pro-файл на проект. Обычный способ сделать это - написать «общий» файл * .pri, который включается в каждый файл * .pro:

folder1.pro

TEMPLATE=lib
TARGET=folder1
include( ../common.pri )

folder2.pro

TEMPLATE=lib
TARGET=folder2
include( ../common.pri )

common.pri (в родительском каталоге)

SOURCES += *.cpp
HEADERS += *.h
# etc.

Очевидно, что содержимое каждого профессионального файла зависит от вашего решения.

Если вы не хотите разделять исходные файлы в нескольких проектах, я думаю, более простым решением было бы переименовать один из конфликтующих файлов.

1 голос
/ 31 мая 2013

Одним из решений является переименование файлов:

A/a_Test.cpp 
B/b_Test.cpp

Это немного некрасиво, но все просто и имена классов могут остаться прежними.

0 голосов
/ 08 января 2013

Я недавно тоже сталкивался с этой проблемой. Разделение проекта на подпроекты усложнило все и, по крайней мере, с моей первой попытки, не сработало. Затем я попробовал CONFIG += object_with_source и CONFIG += object_parallel_to_source, но оба, похоже, не работали с моей версией Qt.

Так вот, как я решил это (для Visual Studio 2010; я не знаю, работает ли то же самое с другими версиями):

Если бы это был обычный проект Visual Studio, а не проект, сгенерированный QMake, вы могли бы решить его, как описано здесь: Visual Studio 2010 & 2008 не может обрабатывать исходные файлы с одинаковыми именами в разных папках? (изменение выходного каталога объектных файлов на относительный каталог путем добавления %(RelativeDir) в настройках проекта «C / C ++»> «Выходные файлы»> «Имя файла объекта»).

Очевидно, что вы не хотите делать это вручную каждый раз, когда создаете новый проект Visual Studio с помощью QMake, так почему бы не автоматизировать его? В конце концов, все файлы проекта Visual Studio - это обычные файлы XML. Если посмотреть на различия до и после установки параметров, то обнаружится, что они сохранены в одном уникальном теге с именем ObjectFileName.

Итак, я написал этот скрипт на Python:

import sys

filename = sys.argv[1]
f = open(filename, "r", -1, "utf-8-sig")
lines = f.readlines()
f.close()
f = open(filename, "w", -1, "utf-8-sig")
for line in lines:
    line = line.replace("</ObjectFileName>", "%(RelativeDir)\</ObjectFileName>")
    f.write(line)
f.close()

.. и используйте его в моем bat-файле, который я всегда вызываю для создания проекта Visual Studio:

qmake -tp vc myproject.pro
@cd ../scripts
unflatten_vcproj_obj_output.py "../src/myproject.vcxproj"
@pause

Не красивое решение, но оно работает.

...