быдлокодер
1724 / 911 / 106
Регистрация: 04.06.2008
Сообщений: 5,680
1

При перекомпиляции сервера перекомпилируется клиент, а что, собственно в этом плохого?

04.03.2013, 12:54. Показов 4049. Ответов 38
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Друзья!
Начинаем цикл вопросов про COM- Объекты. Первый вопрос возник по статье Безверхова, вот здесь статья. Вот там такой пример:

C++
1
2
3
4
5
//myobj.cpp - реализация методов объекта сервера
#include "myobj.h"     
void Foo::SetA(int i){a = i;} 
void Foo::SetB(float f){b = f;} 
void Foo::SetAB(int i, float f){a = i; b = f;}
C++
1
2
3
4
5
6
7
8
9
//myobj.h - определение объекта Foo
class Foo { 
      private:     
                   int a;     float b;   
      public:     
                  void SetA(int i);     
                  void SetB(float f);     
                  void SetAB(int i, float f); 
      };
C++
1
2
3
4
5
6
7
//myclient.cpp - реализация кода клиента
#include "myobj.h"     
int main () {
    Foo Cls;   
    Cls.SetA(12); 
    Cls.SetB(13.2);
}
Видите ли вы здесь неудобство, которое при этом возникает? А неудобство-то вот какое - при компиляции сервера нам действительно нужно знать всё про класс - и про его данные и про его методы. А вот при компиляции клиента нас интересуют только методы - данные-то сервера нам недоступны. И если в процессе развития сервера мы, скажем, добавили в класс еще одну, сугубо внутреннюю, переменную или внутренний метод, то понятно, что нам нужно будет перекомпилировать сервер. Но ведь нам также придется и перекомпилировать клиент - файл myobj.h ведь изменился! А вот сам клиент - не изменялся. А перекомпилировать клиент - придётся...
А перекомпилировать клиент - придётся... А чё не так-то?
...Итак, компилим сервер:

Bash
1
g++ -c myobj.cpp
компилим клиент

Bash
1
g++ -c myclient.cpp
Лепим экзешник.
Bash
1
g++ -o myclient myclient.o myobj.o
Всё! Теперь ты хоть ЗАМЕНЯЙСЯ сервер, хоть чё сюда напиши:

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
class Foo { 
      private:     
            
                   int a;     float b;   
      
      public:     
                  void SetA(int i);     
                  
                  void SetB(float f);     
 
                  //Можно эту функцию закомментить
                  //void SetAB(int i, float f); 
            
          //можно добавить функцию:
          void SetB();  
            
      };
Главное хидер не забудь поправить как надо. И всё. И НЕ НАДО перекомпилировать клиент, то есть не надо давать команду
Bash
1
g++ -c myclient.cpp
А то, что тебе придётся всё-таки линковать
Bash
1
g++ -o myclient myclient.o myobj.o
Так извините меня, сервер и клиент находятся в одном экзешнике. Или автор в претензиях, что мы меняя ЧАСТЬ экзешника (сервер) вынуждены менять ВЕСЬ экзешник? (При совместной компиляции те же рассуждения, там так же создаются *.o файлы, просто если мы совместно будем всё это компилить, мы два раза создадим АБСОЛЮТНО одинаковые файлы myclient.o, незачем два раза создавать одно и то же, да и раздельная компиляция прибавит наглядности.)

Я ничё не понимаю. Может кто-то разъяснит мне, что имел ввиду Безверхов, говоря:
А перекомпилировать клиент - придётся...
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
04.03.2013, 12:54
Ответы с готовыми решениями:

Как отключить клиент от сервера, не закрывая при этом приложения
Приветствую. Имеется 2 приложения сервер-клиент. При загрузке форму сервер запускается на...

Запрет копирования с сервера на клиент при условии, что буфер обмена и маппинг дисков останутся включенными
Добрый день уважаемые форумчане !!! Вопрос не раз поднимался ... но хотел бы изложить свои мысли...

Как узнать о том, что клиент дисконектнулся от сервера?
Здравствуйте. Делаю сервер. В нем есть подсчет пользователей онлайн. Прибавить пользователя, при...

Проверка на стороне сервера, что клиент обработал отправленные данные
Есть клиент и есть сервер, общаются по именованому каналу (named pipe) Проблема: нужно сделать...

38
:)
Эксперт С++
4773 / 3267 / 497
Регистрация: 19.02.2013
Сообщений: 9,046
04.03.2013, 17:51 2
Учитывая, что myclient.cpp содержит включение myobj.h, то очевидно, что при изменении myobj.h нужно пересобрать myclient.cpp.
0
быдлокодер
1724 / 911 / 106
Регистрация: 04.06.2008
Сообщений: 5,680
04.03.2013, 18:35  [ТС] 3
Цитата Сообщение от Tulosba Посмотреть сообщение
Учитывая, что myclient.cpp содержит включение myobj.h, то очевидно, что при изменении myobj.h нужно пересобрать myclient.cpp.
Нет. Вот я вам привёл пример. Если вы измените хидер и не тронете myclient.cpp, а используете myclient.o, который уже есть, небо с землёй местами не поменяется. Всё отлично слинкуется и отработает.
0
:)
Эксперт С++
4773 / 3267 / 497
Регистрация: 19.02.2013
Сообщений: 9,046
04.03.2013, 18:40 4
Цитата Сообщение от kravam Посмотреть сообщение
Если вы измените хидер и не тронете myclient.cpp, а используете myclient.o, который уже есть, небо с землёй местами не поменяется.
Как же не поменяются? Если скажем было так:
C++
1
2
3
4
class world {
int clouds;
int earth;
};
а стало
C++
1
2
3
4
class world {
int earth;
int clouds;
};
И сервер использует новый хедер, а клиент собран со старым. Как думаете, что будет?
0
быдлокодер
1724 / 911 / 106
Регистрация: 04.06.2008
Сообщений: 5,680
04.03.2013, 19:24  [ТС] 5
Ну так вы попробуйте и скажите, что будет. Я вот например меняю код сервера и соответственно, хидер и не трогаю клиент вообще- только линкую (потому что без этого никак; так опять же прилинковываю ПРЕЖНИЙ клиент); и клиент как работал так и работает.

Другое дело, что, допустим мы удаляем из сервера какую-то функцию, а из клиента вызов её не удаляем. Но этот случай мы не рассматриваем, ибо не может клиент быть абсолютно автономен он сервера, он же должен знать, что в сервере присутствует функция такая-то.

И если она и всегда будет присутствовать в сервере, то дальнейшие изменения его не повлияют на работу клиента, даже если реализация самой функции изменится. Хоть ты заизменяйся, хоть ты задобавляйся полей и других функци. Главное, чтобы прототип вызываемой в клиенте функции остался прежним.
0
:)
Эксперт С++
4773 / 3267 / 497
Регистрация: 19.02.2013
Сообщений: 9,046
04.03.2013, 20:28 6
Цитата Сообщение от kravam Посмотреть сообщение
Ну так вы попробуйте и скажите, что будет.
Я попробовал, дело за Вами.
Вот вам код:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
// header.h
#pragma once
 
#include <string>
struct world
{
    world();
    std::string clouds;
    std::string earth;  
};
 
// server.cpp
#include "header.h"
 
world::world()
{
    clouds = "clouds";
    earth = "earth";
}
 
// client.cpp
#include "header.h"
#include <iostream>
 
int main()
{
    world w;
    std::cout << "Clouds = " << w.clouds << std::endl;
    std::cout << "Earth = " << w.earth << std::endl;
}
Собираем сервер:
Bash
1
g++ -c server.cpp
Собираем клиент:
Bash
1
g++ -c client.cpp
Линкуем:
Bash
1
g++ -o client.exe server.o client.o
Запускаем. Проверяем результат.

Clouds = clouds
Earth = earth
Меняем в хедере поля местами. Т.е. теперь так:
C++
1
2
3
4
5
6
7
8
9
10
// header.h
#pragma once
 
#include <string>
struct world
{
    world();
    std::string earth;  
    std::string clouds;
};
Собираем сервер:
Bash
1
g++ -c server.cpp
Линкуем:
Bash
1
g++ -o client.exe server.o client.o
Запускаем. Проверяем результат.
Clouds = earth
Earth = clouds
ч.т.д.
1
быдлокодер
1724 / 911 / 106
Регистрация: 04.06.2008
Сообщений: 5,680
04.03.2013, 21:39  [ТС] 7
Ну допустим. Но я вот сделал так:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
//myobj.h - определение объекта Foo
class Foo { 
      public:     
                  void SetB();     
                  void SetA();     
      };
 
//myobj.cpp
#include "myobj.h"     
#include <stdio.h>     
void Foo::SetA(){printf ("SetA\n");} 
void Foo::SetB(){printf ("SetB\n");} 
 
 
//myclient.cpp - реализация кода клиента
#include <stdio.h>     
#include "myobj.h"     
int main () {
    Foo Cls;   
    Cls.SetA(); 
    Cls.SetB(); 
}
компилю и запускаю. А потом меняю в хидере функции местами, снова компилю (клиент не трогаю) и запускаю, но их вызов происходит так, как и было в первый раз. Хотя на счёт функций такое поведение предсказуемо вроде.

Ну в общем не хотелось бы щас в причины этого всего углубляться, а хотелось бы определить для себя или прочесть где-то я не знаю- когда в случае изменения хидера надо перекомпилировать клиент, а когда необязательно. Безверхов вот считает что всегда надо. А вы как думаете?
0
Модератор
3398 / 2170 / 352
Регистрация: 13.01.2012
Сообщений: 8,404
04.03.2013, 22:04 8
мы думаем что если вы не хотите проблем нужно пересобрать всегда. в чем сложность?
2
быдлокодер
1724 / 911 / 106
Регистрация: 04.06.2008
Сообщений: 5,680
04.03.2013, 22:46  [ТС] 9
сложность в том, что вы думаете, а я бы хотел чтоб вы знали.
0
Jupiter
04.03.2013, 23:56
  #10

Не по теме:

святая корова, а что будет когда ТС дойдет до IDL:D

0
kravam
05.03.2013, 00:47  [ТС]
  #11

Не по теме:

Это типа я лох?

0
Jupiter
05.03.2013, 01:07
  #12

Не по теме:

Цитата Сообщение от kravam Посмотреть сообщение
Это типа я лох?
нет, просто вы глупость спрашиваете и это при все вашем опыте и дотошности

0
kravam
05.03.2013, 02:13  [ТС]
  #13

Не по теме:

то есть мне не спрашивать больше или чё?

0
:)
Эксперт С++
4773 / 3267 / 497
Регистрация: 19.02.2013
Сообщений: 9,046
05.03.2013, 08:12 14
kravam, заранее не известно какие изменения были внесены в заголовочный файл: может там пробелов понаставили, тогда пересборка как бы и не нужна. А может и полностью файл перелопатили. Но чтобы это узнать нужно проанализировать сделанные изменения. И, учитывая, что скорее всего изменения потребуют пересборки, лучше сделать это сразу, а не надеяться что и так прокатит. Особенно когда программа начнет вести себя странным образом.
0
быдлокодер
1724 / 911 / 106
Регистрация: 04.06.2008
Сообщений: 5,680
05.03.2013, 10:39  [ТС] 15
Цитата Сообщение от Tulosba Посмотреть сообщение
заранее не известно какие изменения были внесены в заголовочный файл:
вы хотели сказать в *.cpp файл?

В "заголовочный"здесь не подходит. Я пишу клиент. И я определённо должен видеть заголовочный файл. И все изменения в нём. В противном случае (если у меня нет перед глазами *.h файла) я должен перекомпилировать клиент ПЕРЕД КАЖДЫМ ЗАПУСКОМ- действительно, может *.h изменился, а я и не знаю! Но ради избежания такой ситуации мы и предполагаем, что именно все изменения в *.h нам видны заранее (перед каждым запуском), а вот изменения в*.cpp файле заранее не видны.

Хотя мы здесь разобрались, что измененения в *.h не всегда предполагают изменения в *.cpp файле, но тем не менее, перекомпилировать всё равно надо. Вопрос лишь в том, на изменения в каком файле ориентироваться- на *.h или на*.cpp; и если на *.h, тогда (повторюсь) все изменения в нём именно что и должны быть видны заранее.
0
:)
Эксперт С++
4773 / 3267 / 497
Регистрация: 19.02.2013
Сообщений: 9,046
05.03.2013, 11:49 16
Цитата Сообщение от kravam Посмотреть сообщение
вы хотели сказать в *.cpp файл?
Нет. Именно заголовочный. Ваш вопрос ведь появился на основании следующей цитаты:
Но ведь нам также придется и перекомпилировать клиент - файл myobj.h ведь изменился! А вот сам клиент - не изменялся. А перекомпилировать клиент - придётся...
0
быдлокодер
1724 / 911 / 106
Регистрация: 04.06.2008
Сообщений: 5,680
05.03.2013, 12:08  [ТС] 17
Да, но только в вопросе имелось ввиду- что, во первых, как вы сами заметили
файл myobj.h ведь изменился!
- ну это понятно, а во-вторых: мы знаем, что он изменился и даже видим как именно изменился


Вы же отвечая, предполагаете
Цитата Сообщение от Tulosba Посмотреть сообщение
заранее не известно какие изменения были внесены в заголовочный файл:
++++++++++++++++++++++++++++++++++++++++

То есть я рассматриваю ситуацию-
файл *.h изменился и мы об этом знаем. (и отсюда вопрос- всегда ли в этом случае надо пересобирать клиент)

Вы рассматриваете ситуацию-
то ли он изменился, то ли нет.

++++++++++++++++++++++++++++++++++++++++

Давайте всё-таки мою ситуацию рассмотрим. А с вашей-то всё понятно- коль скоро мы не знаем заранее, изменился *.h файл или нет, надо экзешник компилить на всякий случай каждый раз перед запуском...
0
:)
Эксперт С++
4773 / 3267 / 497
Регистрация: 19.02.2013
Сообщений: 9,046
05.03.2013, 13:29 18
Цитата Сообщение от kravam Посмотреть сообщение
файл *.h изменился и мы об этом знаем. (и отсюда вопрос- всегда ли в этом случае надо пересобирать клиент)
Не всегда. Как я уже говорил, допустим, добавили только пробелы в файл. Вероятно есть и другие ситуации, при которых можно избежать перекомпиляции. Но для этого надо проанализировать изменения. Т.о. есть 2 варианта:
1. Просто пересобрать всё по полной при изменении хедера.
2. Проанализировать изменения. И по результатам анализа принять решение о необходимости полной пересборки.
А так как анализ изменений в подавляющем большинстве случаем займет больше времени, чем безусловная пересборка, то и заниматься таким анализом бессмысленно. Имхо.
1
Модератор
3398 / 2170 / 352
Регистрация: 13.01.2012
Сообщений: 8,404
05.03.2013, 13:51 19
Цитата Сообщение от kravam Посмотреть сообщение
рассматриваю ситуацию
если вы меняли все что угодно в cpp файле - клиента перекомпилировать не нужно.
если вы меняли все что угодно в h файле реализации объекта - клиента перекомпилировать не нужно - вы наследовали от известного интерфейса и позиции методов интерфейса никогда не поменяются - клиент вообще не должен и не может видеть ничего кроме интерфейса.
если вы меняли хоть что нибудь в h файле интерфейса - клиента нужно перекомпилировать всегда.
0
быдлокодер
1724 / 911 / 106
Регистрация: 04.06.2008
Сообщений: 5,680
05.03.2013, 14:02  [ТС] 20
По вашей градации к чему относится этот пример?
https://www.cyberforum.ru/com-... ost4211119

Это по-моему второй случай:
Цитата Сообщение от vxg Посмотреть сообщение
если вы меняли все что угодно в h файле реализации объекта - клиента перекомпилировать не нужно
Там именно что поменяна реализация объекта- поля структуры переставлены местами. И именно что перекомпилировать клиента НУЖНО, иначе смотрите сами что по ссылке получается.
0
05.03.2013, 14:02
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
05.03.2013, 14:02
Помогаю со студенческими работами здесь

Зависает клиент при приёме от сервера
С начало сделал посыл данных только от клиента серверу..там всё хорошо далее начал делать...

Как загрузить файл с сервера по ссылке, при этом переименовав его
Есть ссылка на скачивание файла с сервера: &lt;a class=&quot;link_more_cont&quot; target=&quot;_blank&quot;...

Чем пользоваться при создании клиент-сервера?
День добрый! Есть определенная программа. Работают в ней одновременно до 5 пользователей. В...

Тормоза При Перекомпиляции Бд
Собственно что есть БД на серваке, запускаем перекомпиляцию - 1 шаг (20-30сек) - 2 шаг...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru