Модераторы: bsa
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Как собрать два одноименных класса. warning LNK4042: object specified more.. 
V
    Опции темы
neosapient
Дата 30.4.2013, 17:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 672
Регистрация: 16.8.2006

Репутация: нет
Всего: 4



Здрвствуйте.
Есть сторонний проект, который требуется собрать. Сложность в том, что вся адресация cpp-файлов идет от вершины проекта, а в самом проекте существует два класса с одинаковыми именами. При сборке проекта для одного из класов создается объектный файл, а для другого не создается. После чего линковщик ругается на нехватку объектных файлов.

Сделал упрощенный пример. Допустим, требуется одновременно писать в БД и файл. Сделаны отдельные модули с пространствами имен db и file, которые лежат в одноименных папках. Допустим, и там и там есть класс config. Структура проекта выглядит так:
Код

- main.cpp
+ db\
    - config.hpp
    - config.cpp
+ file\
    - config.hpp
    - config.cpp


В main() я создаю оба объекта my::Db::config() и my::file::config(). 
Обратите внимание как подгружаются заголовочные файлы в db\config.cpp и file\config.cpp! Они подгружаются относительно вершины проекта и содержат путь к hpp-файлу.
db/config.cpp
Код

#include "db/config.hpp" // <-- подгружаю относительно вершины проекта

namespace my {
namespace db {

config::config()
{
    std::cout << "my::db::config" << std::endl;
}

} // namespace db
} // namespace my

file/config.cpp
Код

#include "file/config.hpp"  // <-- подгружаю относительно вершины проекта

namespace my {
namespace file {

config::config()
{
    std::cout << "my::file::config" << std::endl;
}

} // namespace file
} // namespace my


В общем, посмотрел я на проект и на то, что ничего не компилируется и решил поставить вершину проекта в  Additional Include Directories.
Для этого зашел в свойства проекта (Visual Studio 2012, но думаю, от версии студии ошибка не меняется) по адресу "Property->C\C++ -> Additional Include Directories" и прописал вершину проекта "./"
Пробую собрать проект и получаю:
Код

1>Debug\config.obj : warning LNK4042: object specified more than once; extras ignored
1>main.obj : error LNK2019: unresolved external symbol "public: __thiscall my::db::config::config(void)" (??0config@db@my@@QAE@XZ) referenced in function _main


Как я понимаю, объектный файл для file::config создался в виде config.obj, а для db::config не создался из-за занятого имени.
Как собрать правильно проект? Проект прикреплен к посту.



Это сообщение отредактировал(а) neosapient - 30.4.2013, 21:44
PM MAIL   Вверх
NoviceF
Дата 30.4.2013, 19:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 313
Регистрация: 13.3.2012
Где: Ростов-на-Дону

Репутация: 2
Всего: 2



Вариант переименовать файлы не рассматривается? Не делал вручную make файлы, но мне кажется, как вариант можно изменить правило в make, по которому формируется этот объектный файл, но как именно, и как на это будет реагировать IDE не могу сказать..
PM MAIL   Вверх
neosapient
Дата 30.4.2013, 19:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 672
Регистрация: 16.8.2006

Репутация: нет
Всего: 4



Вариант переименовать файлы не подходит.
Цитата

как вариант можно изменить правило в make, по которому формируется этот объектный файл

как это сделать? 
мне б инструкцию к решению моей задачи?
PM MAIL   Вверх
NoviceF
Дата 30.4.2013, 19:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 313
Регистрация: 13.3.2012
Где: Ростов-на-Дону

Репутация: 2
Всего: 2



Вот так примерно выглядит область make файла отвечающая за сборку простого проекта, который ты привёл вначале (это проект Qt)

Код

####### Compile

debug/main.o: ../testapp/main.cpp 
    $(CXX) -c $(CXXFLAGS) $(INCPATH) -o debug/main.o ../testapp/main.cpp

debug/config.o: ../testapp/file/config.cpp ../testapp/file/config.h
    $(CXX) -c $(CXXFLAGS) $(INCPATH) -o debug/config.o ../testapp/file/config.cpp

debug/config.o: ../testapp/db/config.cpp 
    $(CXX) -c $(CXXFLAGS) $(INCPATH) -o debug/config.o ../testapp/db/config.cpp


что-то про make есть здесь http://habrahabr.ru/post/111691/ Но вообще нужно покопаться и понять что к чему, думаю проблема решаема.

Обсуждение аналогичной проблемы http://www.gamedev.ru/code/forum/?id=155999

UPD. Вот ещё пара тем почитать 
http://stackoverflow.com/questions/2281532...n-different-fol 
http://stackoverflow.com/questions/3695174...3731643#3731643

Как видим, в студии можно менять имя объектного файла прямо в её интерфейсе. В общем от IDE варианты решения тоже зависят.


Может сейчас кто из опытных товарищей подскажет.



Это сообщение отредактировал(а) NoviceF - 30.4.2013, 20:44
PM MAIL   Вверх
neosapient
Дата 30.4.2013, 21:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 672
Регистрация: 16.8.2006

Репутация: нет
Всего: 4



NoviceF, спасибо!

Всё решилось через настройку 
Цитата

C/C++ -> Output Files -> "Object File Name" to be the following:

$(IntDir)/%(RelativeDir)/


+

Присоединённый файл ( Кол-во скачиваний: 1 )
Присоединённый файл  test_fixed.zip 2,67 Kb
PM MAIL   Вверх
NoviceF
Дата 30.4.2013, 21:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 313
Регистрация: 13.3.2012
Где: Ростов-на-Дону

Репутация: 2
Всего: 2



Цитата(neosapient @  30.4.2013,  22:42 Найти цитируемый пост)
Всё решилось через настройку 

ну отлично smile
PM MAIL   Вверх
NoviceF
Дата 4.5.2013, 20:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 313
Регистрация: 13.3.2012
Где: Ростов-на-Дону

Репутация: 2
Всего: 2



Вот решение для Qt:

http://stackoverflow.com/a/7770815

CONFIG += object_parallel_to_source
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "C/C++: Для новичков"
JackYF
bsa

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, JackYF, bsa.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Для новичков | Следующая тема »


 




[ Время генерации скрипта: 0.0492 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.