Перейти к содержанию

Как использовать скомпилированную программу на cpp на другом сервере?


Рекомендуемые сообщения

Есть некая программа на срр, я ее компилировал у себя на локальном Линухе и полученный файл a.out прекрасно работает там же!

Затем я перенес этот файл на хостинг моего провайдера - там он не пашет выдает синтаксическую ошибку!

Перекомпиляцией исходника на сервере провайдера - полученный a.out работает прекрасно!

Вопрос, почему не работал первый, скомпилированный у меня файл на сервере провайдера?

Надо обязательно компилит по новой для другого Линукса?

Разве полученный файл не бинарник, который должен работать на любом Линуксе?

Ссылка на комментарий
Поделиться на другие сайты

armix писал(а) Sun, 07 January 2007 13:25

Есть некая программа на срр, я ее компилировал у себя на локальном Линухе и полученный файл a.out прекрасно работает там же!

Затем я перенес этот файл на хостинг моего провайдера - там он не пашет выдает синтаксическую ошибку!

_Синтаксическую_ ошибку выдает компилятор при собирании бинарника. Сами бинарники с синтаксисом никак не связаны.

Цитата:

Перекомпиляцией исходника на сервере провайдера - полученный a.out работает прекрасно!

Вопрос, почему не работал первый, скомпилированный у меня файл на сервере провайдера?

Ответ - потому, что системы не идентичны, соотв. на разных системах Ваш бинарник линкуется с разными версиями библиотек.

Цитата:

Разве полученный файл не бинарник, который должен работать на любом Линуксе?

Нет. Термин "dll hell" не в Линухе придуман. Делайте выводы Smile

Ссылка на комментарий
Поделиться на другие сайты

Привести исходник не могу, могу лишь более подробно все описать!

Итак, мы имеем некий my.cpp который использует класс class.cpp.

Есть 2 сервера:

SERVER1 - мой локальный Debiweb Linux сервер

SERVER2 - сервер провайдера FreeBSD Linux сервер

ДЕЙСТВИЕ - 1

Копирую на SERVER1 class.cpp и компоную class.o, затем компилирую с my.cpp - получаю a.out ВСЕ РАБОТАЕТ ХОРОШО.

ДЕЙСТВИЕ - 2

Копирую на SERVER2 полученный на SERVER1 a.out получаю ошибку:

$ ./a.out

ELF binary type "0" not known.

./a.out: 14: Syntax error: ")" unexpected

ДЕЙСТВИЕ - 3

Копирую на SERVER2 полученный на SERVER1 class.o, затем компилирую с my.cpp получаю ошибку (привожу небольшой кусок ради экономия места на форуме!):

: undefined reference to `cout'

class.o(.text+0x686): In function `Class::SetCodePage(Code) const':

: undefined reference to `ostream::operator<<(char const *)'

class.o(.text+0x69f): In function `Class::SetCodePage(Code) const':

: undefined reference to `cout'

class.o(.text+0x6a4): In function `Class::SetCodePage(Code) const':

: undefined reference to `ostream::operator<<(char const *)'

class.o(.text+0xbcb): In function `Class::PrintBuffHexGetPost(void) const':

: undefined reference to `cout'

class.o(.text+0xbd0): In function `Class::PrintBuffHexGetPost(void) const':

: undefined reference to `ostream::operator<<(char const *)'

class.o(.text+0xbe4): In function `Class::PrintBuffHexGetPost(void) const':

: undefined reference to `cout'

class.o(.text+0xbe9): In function `Class::PrintBuffHexGetPost(void) const':

: undefined reference to `ostream::operator<<(char const *)'

class.o(.text+0xbf4): In function `Class::PrintBuffHexGetPost(void) const':

: undefined reference to `ostream::operator<<(char const *)'

class.o(.text+0xc04): In function `Class::PrintBuffHexGetPost(void) const':

: undefined reference to `cout'

class.o(.text+0xc09): In function `Class::PrintBuffHexGetPost(void) const':

: undefined reference to `ostream::operator<<(char const *)'

class.o(.text+0xc23): In function `Class::PrintBuffHexGetPost(void) const':

: undefined reference to `cout'

ДЕЙСТВИЕ - 4

Копирую на SERVER2 class.cpp и компоную class.o, затем компилирую с my.cpp - получаю a.out ВСЕ РАБОТАЕТ ХОРОШО.

ДЕЙСТВИЕ - 5

Произвожу с полученными class.o, a.out на SERVER2 те же действия, только в обратном порядке на мой локальный Линукс сервер SERVER1 и получаю ошибки:

$ ./a.out

-bash: ./a.out: No such file or directory

/tmp/ccpsgDbR.o: In function `main':

/tmp/ccpsgDbR.o(.text+0x14): undefined reference to `Class::Class(void)'

/tmp/ccpsgDbR.o(.text+0x28): undefined reference to `Class::SetCodePage(Code) const'

/tmp/ccpsgDbR.o(.text+0x41): undefined reference to `Class::GetHttpHost(char *) const'

class.o: In function `std::__verify_grouping(char const*, unsigned, std::basic_string<char, std::char_traits<char>, std::allocator<char> > const&)':

class.o(.text+0xd): undefined reference to `std::basic_string<char, std::char_traits<char>, std::allocator<char> >::size() const'

class.o(.text+0x60): undefined reference to `std::basic_string<char, std::char_traits<char>, std::allocator<char> >::operator[](unsigned) const'

class.o(.text+0x9d): undefined reference to `std::basic_string<char, std::char_traits<char>, std::allocator<char> >::operator[](unsigned) const'

class.o(.text+0xc8): undefined reference to `std::basic_string<char, std::char_traits<char>, std::allocator<char> >::operator[](unsigned) const'

class.o: In function `Class::Class[not-in-charge]()':

Как я мог понять, все зависит от разных Линукс серверов, но почему такое происходит я не могу понять!

По идее, компилируется программа и ее бинарник должен работать на Любом Линуксе.

ЗЫ я пробовал ДЕЙСТВИЕ - 3 на бесплатном хостинге h10.ru - там все сработало и нормально скомпилировало!

Ссылка на комментарий
Поделиться на другие сайты

armix писал(а) Mon, 08 January 2007 14:18

Привести исходник не могу, могу лишь более подробно все описать!

Итак, мы имеем некий my.cpp который использует класс class.cpp.

Есть 2 сервера:

SERVER1 - мой локальный Debiweb Linux сервер

SERVER2 - сервер провайдера FreeBSD Linux сервер

/* Skip */

Как я мог понять, все зависит от разных Линукс серверов, но почему такое происходит я не могу понять!

По идее, компилируется программа и ее бинарник должен работать на Любом Линуксе.

ЗЫ я пробовал ДЕЙСТВИЕ - 3 на бесплатном хостинге h10.ru - там все сработало и нормально скомпилировало!

BSD != Linux != Unix

Понятно?

Ссылка на комментарий
Поделиться на другие сайты

Sleeping Daemon писал(а) Mon, 08 January 2007 12:34

armix писал(а) Mon, 08 January 2007 14:18

Привести исходник не могу, могу лишь более подробно все описать!

Итак, мы имеем некий my.cpp который использует класс class.cpp.

Есть 2 сервера:

SERVER1 - мой локальный Debiweb Linux сервер

SERVER2 - сервер провайдера FreeBSD Linux сервер

/* Skip */

Как я мог понять, все зависит от разных Линукс серверов, но почему такое происходит я не могу понять!

По идее, компилируется программа и ее бинарник должен работать на Любом Линуксе.

ЗЫ я пробовал ДЕЙСТВИЕ - 3 на бесплатном хостинге h10.ru - там все сработало и нормально скомпилировало!

BSD != Linux != Unix

Понятно?

На www.h10.ru стоял также FreeBSD и все компилировалось нормально!!!

Ссылка на комментарий
Поделиться на другие сайты

armix писал(а) Mon, 08 January 2007 12:55

Sleeping Daemon писал(а) Mon, 08 January 2007 12:34

BSD != Linux != Unix

Понятно?

На www.h10.ru стоял также FreeBSD и все компилировалось нормально!!!

Вы сказали

Цитата:

SERVER2 - сервер провайдера FreeBSD Linux сервер

Об этом и речь.

Теперь по Вашему посту. Вводный курс:

Компиляция состоит из двух этапов:

1. Создание объектного файла, то есть заготовки бинарника.

2. Линковка, то есть связывание полученного объектного файла с системными библиотеками.

До первого этапа у нас есть текстовый исходник, который, разумеется, в принципе является кроссплатформенным. После первого этапа получаем объектный файл, причем специфичного для системы формата. После второго получаем бинарник, связанный с конкретными версиями библиотек. Теперь, что происходило с Вашими файлами.

ДЕЙСТВИЕ 1

Вы взяли исходный код, собрали родной для системы объектный файл, после чего слинковали его с соотв. библиотеками. Все работает.

ДЕЙСТВИЕ 2

Вы копируете исполняемый файл ELF в систему FreeBSD, которая использует совершенно другой формат объектных файлов. Ничего не работает.

ДЕЙСТВИЕ 3

То же, что и 2, но теперь это не бинарник, а объектный файл, что сути не меняет.

ДЕЙСТВИЕ 4

То же, что и 1, но в другой ОС. Все работает. Smile

ДЕЙСТВИЕ 5

То же, что и 2

Ссылка на комментарий
Поделиться на другие сайты

EvilShadow писал(а) Mon, 08 January 2007 17:06

armix писал(а) Mon, 08 January 2007 12:55

Sleeping Daemon писал(а) Mon, 08 January 2007 12:34

BSD != Linux != Unix

Понятно?

На www.h10.ru стоял также FreeBSD и все компилировалось нормально!!!

Вы сказали

Цитата:

SERVER2 - сервер провайдера FreeBSD Linux сервер

Об этом и речь.

Теперь по Вашему посту. Вводный курс:

Компиляция состоит из двух этапов:

1. Создание объектного файла, то есть заготовки бинарника.

2. Линковка, то есть связывание полученного объектного файла с системными библиотеками.

До первого этапа у нас есть текстовый исходник, который, разумеется, в принципе является кроссплатформенным. После первого этапа получаем объектный файл, причем специфичного для системы формата. После второго получаем бинарник, связанный с конкретными версиями библиотек. Теперь, что происходило с Вашими файлами.

ДЕЙСТВИЕ 1

Вы взяли исходный код, собрали родной для системы объектный файл, после чего слинковали его с соотв. библиотеками. Все работает.

ДЕЙСТВИЕ 2

Вы копируете исполняемый файл ELF в систему FreeBSD, которая использует совершенно другой формат объектных файлов. Ничего не работает.

ДЕЙСТВИЕ 3

То же, что и 2, но теперь это не бинарник, а объектный файл, что сути не меняет.

ДЕЙСТВИЕ 4

То же, что и 1, но в другой ОС. Все работает. Smile

ДЕЙСТВИЕ 5

То же, что и 2

Все понятно спасибо!

Ссылка на комментарий
Поделиться на другие сайты

Присоединяйтесь к обсуждению

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

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

Загрузка...
×
×
  • Создать...