Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Особенности линковки в MSVC 2008, В консоли - линкуется, в IDE - нет 
V
    Опции темы
zim22
Дата 17.7.2009, 11:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


depict1
****


Профиль
Группа: Завсегдатай
Сообщений: 2682
Регистрация: 15.1.2009
Где: Украина

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



Создаю проект, состоящий из 3 файлов, описаных ниже.
Затем Build Solution нажимаю и получаю ошибку линковки:
Цитата

1>Linking...
1>first.obj : error LNK2005: "public: int __thiscall first::mem_fun(void)" (?mem_fun@first@@QAEHXZ) already defined in main.obj
1>D:\_Programming\study\Stroustrup\287\Debug\main.exe : fatal error LNK1169: one or more multiply defined symbols found


Если же компилировать и линковать через командную строку, то exe-файл создаётся успешно.
Код

cl /EHsc /c first.cpp
cl /EHsc /c main.cpp
link main.obj

или одной строкой:
Код

cl /EHsc main.cpp


Если же линковать два .obj файла вместе, то будет вышеупомянутая ошибка:
Код

link main.obj first.obj


Цитата

first.obj : error LNK2005: "public: int __thiscall first::mem_fun(void)" (?mem_fun@first@@QAEHXZ) already defined in main.obj
main.exe : fatal error LNK1169: one or more multiply defined symbols found


Можете объяснить, что происходит? Это ограничение IDE-среды?

Код

// main.cpp
#include "first.h"
#include <iostream>

int main() {
  first f;
  std::cout << f.mem_fun() << std::endl;

  return 0;
}


Код

// first.h
#ifndef FIRST_H
#define FIRST_H

struct first{
  int mem_fun();
};

int first::mem_fun() { return 5; }
#endif


Код

// first.cpp
#include "first.h"


Это сообщение отредактировал(а) zim22 - 17.7.2009, 12:12


--------------------
PM MAIL   Вверх
Alca
Дата 17.7.2009, 11:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 3993
Регистрация: 14.6.2006

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



Код

#ifndef uMain_h__
#define uMain_h__


#endif // uMain_h__

???

Добавлено через 44 секунды
В хидере.


--------------------
PM WWW ICQ Skype Jabber   Вверх
zim22
Дата 17.7.2009, 11:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


depict1
****


Профиль
Группа: Завсегдатай
Сообщений: 2682
Регистрация: 15.1.2009
Где: Украина

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



Цитата(Alca @  17.7.2009,  11:48 Найти цитируемый пост)
??? В хидере.

ничего не понял.


--------------------
PM MAIL   Вверх
Alca
Дата 17.7.2009, 11:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 3993
Регистрация: 14.6.2006

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



Покаж весь код


--------------------
PM WWW ICQ Skype Jabber   Вверх
zim22
Дата 17.7.2009, 12:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


depict1
****


Профиль
Группа: Завсегдатай
Сообщений: 2682
Регистрация: 15.1.2009
Где: Украина

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



Цитата(Alca @  17.7.2009,  11:56 Найти цитируемый пост)
Покаж весь код

я его показал. в первом же сообщении.
весь проект(код) состоит из 3 файлов
1) main.cpp
2) first.cpp
3) first.h

Это сообщение отредактировал(а) zim22 - 17.7.2009, 12:10


--------------------
PM MAIL   Вверх
Alca
Дата 17.7.2009, 12:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 3993
Регистрация: 14.6.2006

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



У меня твои исходники скопилились.


--------------------
PM WWW ICQ Skype Jabber   Вверх
zim22
Дата 17.7.2009, 12:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


depict1
****


Профиль
Группа: Завсегдатай
Сообщений: 2682
Регистрация: 15.1.2009
Где: Украина

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



Цитата(Alca @  17.7.2009,  12:18 Найти цитируемый пост)
У меня твои исходники скопилились.

весело...
какая студия? скомпилились или слинковались? на выходе exe файл получился?
как компилил? IDE/консоль?


--------------------
PM MAIL   Вверх
Alca
Дата 17.7.2009, 12:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 3993
Регистрация: 14.6.2006

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



test.zip

Присоединённый файл ( Кол-во скачиваний: 2 )
Присоединённый файл  test.zip 2,31 Kb


--------------------
PM WWW ICQ Skype Jabber   Вверх
Alca
Дата 17.7.2009, 12:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 3993
Регистрация: 14.6.2006

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



VS 2008, скомпилилось и слинковалось, получил ехе,  компилил IDE.

Присоединённый файл ( Кол-во скачиваний: 3 )
Присоединённый файл  test.zip 2,31 Kb


--------------------
PM WWW ICQ Skype Jabber   Вверх
zim22
Дата 17.7.2009, 12:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


depict1
****


Профиль
Группа: Завсегдатай
Сообщений: 2682
Регистрация: 15.1.2009
Где: Украина

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



Цитата(Alca @  17.7.2009,  12:24 Найти цитируемый пост)
VS 2008, скомпилилось и слинковалось, получил ехе,  компилил IDE.

ты не правильно компилил. нужно было в проект включить все файлы. а не один main.cpp


Присоединённый файл ( Кол-во скачиваний: 2 )
Присоединённый файл  cpp_link.rar 3,54 Kb


--------------------
PM MAIL   Вверх
AlexT84
Дата 17.7.2009, 12:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Попробуй:
Код

// first.h
#ifndef FIRST_H
#define FIRST_H
static struct first{
  int mem_fun();
};
int first::mem_fun() { return 5; }
#endif

PM MAIL   Вверх
Alca
Дата 17.7.2009, 12:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 3993
Регистрация: 14.6.2006

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



Код

// first.h
#ifndef FIRST_H
#define FIRST_H

struct first{
  int mem_fun();
};


#endif

// first.cpp
#include "first.h"

int first::mem_fun() { return 5; }

 smile 


--------------------
PM WWW ICQ Skype Jabber   Вверх
AlexT84
Дата 17.7.2009, 12:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



А не, не получится, у тебя же функция конфликтует, а не структура

перенеси int first::mem_fun() { return 5; } в first.cpp. Компилятор, когда находит инклуд копирует содержимое файла вместо инклуда. Потом компилит 2 obj файла (для main.cpp и first.cpp) в которых есть этот метод, попавший в них из first.h. Линкер, при попытке собрать чего либо из получившихся obj, находит там одинаковые методы и выдаёт ошибку.

Это сообщение отредактировал(а) AlexT84 - 17.7.2009, 12:47
PM MAIL   Вверх
mrbrooks
Дата 17.7.2009, 12:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


трололомен
****


Профиль
Группа: Завсегдатай
Сообщений: 4259
Регистрация: 4.10.2006
Где: Дол Гулдур

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



zim22, вынеси 
Код

int first::mem_fun() { return 5; }

в first.cpp

Добавлено через 1 минуту и 38 секунд
либо
Код

// first.h
#ifndef FIRST_H
#define FIRST_H
static struct first{
  int mem_fun(){ return 5; }
};
#endif

PM MAIL   Вверх
zim22
Дата 17.7.2009, 12:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


depict1
****


Профиль
Группа: Завсегдатай
Сообщений: 2682
Регистрация: 15.1.2009
Где: Украина

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



Код

// first.h
#ifndef FIRST_H
#define FIRST_H
struct first{  
  int mem_fun();
};
#endif

// first.cpp
#include "first.h"
int first::mem_fun() { return 5; }

Alca, mrbrooks, 
я знаю, что так заработает без проблем. Но прикол как раз в том, чтобы слинковалось так, как у меня в файлах. 
Т.е. функция-член должна быть определена в h-файле, вне класса.
***
в общем я понял, почему в консоли линкуется, а в IDE - нет. (озарение пришло, когда отошёл от компаsmile )
IDE пыталась собрать(слинковать) все объектные файлы. Но обламывалась, т.к. и в first.cpp (first.obj) и в main.cpp(main.obj) была определена одна и таже фукнция.
а в консоли я непрвильно собирал smile указывал только main.cpp для сборки. соответственно никаких конфликтов не было, т.к. header только один раз подключался.
нужно было так:
Код

cl /EHsc main.cpp first.cpp

и тогда и в консоли возникла бы ошибка.

Это сообщение отредактировал(а) zim22 - 17.7.2009, 12:54


--------------------
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Visual C++/MFC/WTL | Следующая тема »


 




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


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

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