2016-12-09 2 views
0

У меня есть проект, который включал в себя несколько файлов, которые включены в другиеC++, включая .cpp: избежать ошибок нескольких определений

A.h --> B.h means A.h is included in B.h 

Есть много включений, как

A.h --> X.h 
B.h --> A.h 
B.h --> X.h 

Что все работает отлично. Теперь у меня есть проблема, что мне нужно включить файл cpp (а не мой файл, не могу ничего с ним поменять). EDIT: Там нет соответствующего .h файл для этого .cpp Как только я сделать что-то вроде

Z.cpp --> B.h 

Я получаю ошибку компиляции для нескольких объявлений. Я также попытался

Z.cpp --> B.cpp 

Аналогичного результата, только меньше ошибок (B.h включена во многих других заголовочных файлах)

Как я могу включить этот .cpp?

EDIT: Я понимаю, откуда исходит ошибка, мне просто интересно, есть ли способ обхода проблемы.

+0

Не указывайте исходные файлы '# include'. Скомпилируйте их отдельно в объектные файлы, которые вы затем связываете. –

+0

Вы хотите сделать библиотеку из этого cpp? – chrise

+0

Нет, просто отдельная компиляция исходного файла в один файл объекта. –

ответ

1

Это основной материал для разработки программного обеспечения на С ++, я предлагаю вам прочитать книгу для ознакомления о том, как скомпилировать и построить программу.

В принципе, в C++, вы #include * .h файлы в * .cpp исходных файлов,
затем скомпилировать каждый * .cpp файл,
затем ссылку все скомпилированные файлы (обычно * .o на * nix или * .obj в Windows) в исполняемую программу или библиотеку, которая затем будет связана в программе.

Я считаю очень плохой практикой, чтобы # включить файл *, cpp в другой файл cpp.

Поскольку вы используете QTCreator, у вас должен быть проект, который уже занимается этим процессом.

+0

Проблема в том, что для этого .cpp не существует соответствующего файла .h. И это внешний файл, поэтому им нечего что-то менять. – chrise

+0

, если вы включили этот cpp в свой исходный список, вы можете сами создать заголовочный файл для этого cpp, который является просто копией объявлений функций, которые вы хотите переслать другим файлам cpp. заголовочный файл - это просто объявление вперед, которое сообщает компилятору, что вы найдете метод, подобный этому, в компилированном источнике ... поэтому используйте этот метод. – Jonathan

2

Если вы используете QtCreator, то он должен создавать объектные файлы для каждого исходного файла, включенного в проект.

Вот почему вы получаете несколько ошибок определения. У вас есть, скажем, исходный файл Z.cpp, который встроен в Z.o. Затем у вас есть Z.cpp, включенный в B.cpp, который встроен в B.o. Теперь, когда компоновщик пытается связать Z.o и B.o с исполняемой программой, символы, определенные в Z.cpp, будут существовать в и объектных файлах, что приводит к ошибкам.

IDE (QtCreator) гарантирует, что исходные файлы будут созданы и связаны друг с другом, образуя один исполняемый файл. Не делайте #include любого исходного файла в другой исходный файл (или, что еще хуже, файл заголовка).

Классы, структуры, прототипы функций и декларации внешние переменные являются (или должны быть) в заголовка файла, который вы включаете. Внедрение функций и функций члена не-встроенного класса или структуры находится в исходном файле, компилятор и компоновщик будут знать, как ссылаться на них из объектных файлов.

0

Учитывая комментарии здесь, я добавил свой собственный заголовочный файл. что решило проблему. Спасибо за указание на это.

+0

Вы должны принять ответ или изменить свой вопрос или добавить комментарий. Пожалуйста, не добавляйте ответ, чтобы сказать, что вы решили проблему, благодаря другим ответам. – roalz

Смежные вопросы