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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Как правильно собрать файлы проекта? 
V
    Опции темы
Alca
Дата 26.11.2008, 10:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



Как правильно собрать файлы проекта?

1. Модули с функциями:    
    MyStrFunc.cpp        //функции не являются методами каких-либо классов
Код

void Func1() {....}
void Func2() {....}
void Func3() {....}

MyFSOStrFunc.cpp    //функции не являются методами каких-либо классов
Код

void Func1() {....}
void Func2() {....}
void Func3() {....}
 

2. Классы:
CIni.h
Код

//объявление класса 
class CIni {/*....*/)

CIni.cpp
Код

#include "CIni.h"
#include "MyStrFunc.cpp"
#include "MyFSOStrFunc.cpp"
            
//реализация класса
//...

CPerform.h
Код

//объявление класса 
class CPerform {/*....*/)

CPerform.cpp
Код

#include "CPerform.h"
#include "MyStrFunc.cpp"    
#include "MyFSOStrFunc.cpp"    
            
//реализация класса
//...

     
3. Главный модуль:
uMain.h
uMain.cpp
Код

//Делаю "Projject -> Add Existing Item..." и подключаю к проекту классы
#include "CIni.h"
#include "CPerform.h"
    
int WINAPI WinMain(HINSTANCE hInstance,    HINSTANCE hPrevInstance, LPSTR lpCmdLine, int iCmdShow) {
        //...
}


Результат:    
Код

//......    
Error    1    error LNK2005: "long __cdecl StrToLONG(char const *,long,int)" (?StrToLONG@@YAJPBDJH@Z) already defined in uMain.obj    CIni.obj
Error    2    error LNK2005: "unsigned long __cdecl StrToDWORD(char const *,unsigned long,int)" (?StrToDWORD@@YAKPBDKH@Z) already defined in uMain.obj    CIni.obj
Error    163    error LNK2005: "long __cdecl StrToLONG(char const *,long,int)" (?StrToLONG@@YAJPBDJH@Z) already defined in uMain.obj    CPerform.obj
Error    164    error LNK2005: "unsigned long __cdecl StrToDWORD(char const *,unsigned long,int)" (?StrToDWORD@@YAKPBDKH@Z) already defined in uMain.obj    CPerform.obj
//......

Ключевая фраза здесь: "already defined".  smile 

Это сообщение отредактировал(а) Alca - 26.11.2008, 10:55


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


Эксперт
****


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

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



заглушки против двойных включений стоят на h файлах ?


--------------------
Что-то не поняли? -> Напейтесь до зеленых человечков... эта сверхцивилизация Вам поможет...
PM MAIL Jabber   Вверх
Alca
Дата 26.11.2008, 11:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



Стоят:
Код

#pragma once

#ifndef ИмяКлассаH
#define ИмяКлассаH 


Добавлено через 13 минут и 4 секунды
Как правильно подключить класс к проекту?


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


Эксперт
****


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

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



Цитата(Alca @  26.11.2008,  10:48 Найти цитируемый пост)
#include "MyStrFunc.cpp"
#include "MyFSOStrFunc.cpp"

Нужно указывать .h-файлы, в которых описаны прототипы функций.
MyStrFunc.h
Код
#ifndef MyStrFunc_H
#define MyStrFunc_H

void Func1();
void Func2();
void Func3();

#endif

MyFSOStrFunc.h
Код
#ifndef MyFSOStrFunc_H
#define MyFSOStrFunc_H

void Func1();
void Func2();
void Func3();

#endif

CIni.cpp
Код
#include "CIni.h"
#include "MyStrFunc.h"
#include "MyFSOStrFunc.h"

//...

CPerform.cpp
Код
#include "CPerform.h"
#include "MyStrFunc.h"
#include "MyFSOStrFunc.h"

//...

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


Эксперт
****


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

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



586, сделал как ты написал:
Код

Error    11    error LNK2019: unresolved external symbol "class std::basic_string<char,struct std::char_traits<char>,class std::allocator<char> > __cdecl sTypeToStr<double>(double)" (??$sTypeToStr@N@@YA?AV?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@N@Z) referenced in function "public: void __thiscall CPerform::vStop(void)" (?vStop@CPerform@@QAEXXZ)    CPerform.obj

CPerform.cpp
Код

void CPerform::vStop() {
    //...
    std::string str1 = sTypeToStr(1); //компилиться
    //...
    //если sTypeToStr с целочисленной переменной, то всё компилиться, а с double не хочет:
    std::string str2 = sTypeToStr(1.0);  //не компилиться
}

CXString.cpp (выше был как MyStrFunc.cpp)
Код

#include <assert.h>        
#include <sstream>
#include <iostream>
#include <windows.h>
#include <string>
#include <vector>
#include <sstream>
#include <tchar.h>
#include <stdlib.h>
#include <iostream>
//...
template <typename T> std::string sTypeToStr(T val) {
    std::ostringstream oss;
    oss << val;

    return oss.str();
}

Добавляю след. функцию (без шаблонов) и все компилться:
Код

std::string sTypeToStr(double val) {
    std::ostringstream oss;
    oss << val;

    return oss.str();
}

Почему не работает с шаблоном? 
P.S. Эта функция sTypeToStr вызывается не один раз и с разными параметрами.



Это сообщение отредактировал(а) Alca - 26.11.2008, 13:15


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


Эксперт
****


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

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



Реализуй шаблонную функцию в .h-файле.
Или сделай вызов этой функции в CXString.cpp для double.
Код
template <typename T> std::string sTypeToStr(T val) {
    std::ostringstream oss;
    oss << val;
    return oss.str();
}

void test()
{
    sTypeToStr(1);
    sTypeToStr(1.0);
}


другого выхода я не вижу...

Цитата
Почему не работает с шаблоном? 

С шаблоном не работает, потому что реализации для double нету в объектном файле CXString.obj... Не будет же компилятор делать реализацию шаблонных функций для всех существующих типов. Для типа int он сделал реализацию, потому что эта функция вызывается где-то в CXString.cpp.
Когда компилируется CXString.cpp, компилятор не знает о других .cpp-файлах.
PM   Вверх
Alca
Дата 26.11.2008, 14:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



Цитата

Реализуй шаблонную функцию в .h-файле.

Типа вместо прототипа:
Код

template <typename T> std::string sTypeToStr(T val);

написать:
Код

template <typename T> std::string sTypeToStr(T val) {
    std::ostringstream oss;
    oss << val;
    return oss.str();
}

в CXString.h? да?

Это сообщение отредактировал(а) Alca - 26.11.2008, 14:02


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


Эксперт
****


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

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



да.
PM   Вверх
Alca
Дата 26.11.2008, 14:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



Спасибо 586, выручил.  smile 
Я тебе там крестик поставил. 
P.S. Действительно эта функция вызывалась для int. smile 

Это сообщение отредактировал(а) Alca - 26.11.2008, 14:13


--------------------
PM WWW ICQ Skype Jabber   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
Earnest Daevaorn

Добро пожаловать!

  • Черновик стандарта C++ (за октябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика(4.4мб).
  • Черновик стандарта C (за сентябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика (3.4мб).
  • Прежде чем задать вопрос, прочтите это и/или это!
  • Здесь хранится весь мировой запас ссылок на документы, связанные с C++ :)
  • Не брезгуйте пользоваться тегами [code=cpp][/code].
  • Пожалуйста, не просите написать за вас программы в этом разделе - для этого существует "Центр Помощи".
  • C++ FAQ

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

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


 




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


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

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