armix Опубликовано 7 января, 2007 Жалоба Поделиться Опубликовано 7 января, 2007 Есть некая программа на срр, я ее компилировал у себя на локальном Линухе и полученный файл a.out прекрасно работает там же! Затем я перенес этот файл на хостинг моего провайдера - там он не пашет выдает синтаксическую ошибку! Перекомпиляцией исходника на сервере провайдера - полученный a.out работает прекрасно! Вопрос, почему не работал первый, скомпилированный у меня файл на сервере провайдера? Надо обязательно компилит по новой для другого Линукса? Разве полученный файл не бинарник, который должен работать на любом Линуксе? Цитата Ссылка на комментарий Поделиться на другие сайты Поделиться
Ineu Опубликовано 7 января, 2007 Жалоба Поделиться Опубликовано 7 января, 2007 armix писал(а) Sun, 07 January 2007 13:25 Есть некая программа на срр, я ее компилировал у себя на локальном Линухе и полученный файл a.out прекрасно работает там же! Затем я перенес этот файл на хостинг моего провайдера - там он не пашет выдает синтаксическую ошибку! _Синтаксическую_ ошибку выдает компилятор при собирании бинарника. Сами бинарники с синтаксисом никак не связаны. Цитата: Перекомпиляцией исходника на сервере провайдера - полученный a.out работает прекрасно! Вопрос, почему не работал первый, скомпилированный у меня файл на сервере провайдера? Ответ - потому, что системы не идентичны, соотв. на разных системах Ваш бинарник линкуется с разными версиями библиотек. Цитата: Разве полученный файл не бинарник, который должен работать на любом Линуксе? Нет. Термин "dll hell" не в Линухе придуман. Делайте выводы Цитата Ссылка на комментарий Поделиться на другие сайты Поделиться
armix Опубликовано 8 января, 2007 Автор Жалоба Поделиться Опубликовано 8 января, 2007 Привести исходник не могу, могу лишь более подробно все описать! Итак, мы имеем некий 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 - там все сработало и нормально скомпилировало! Цитата Ссылка на комментарий Поделиться на другие сайты Поделиться
Sleeping Daemon Опубликовано 8 января, 2007 Жалоба Поделиться Опубликовано 8 января, 2007 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 Понятно? Цитата Ссылка на комментарий Поделиться на другие сайты Поделиться
armix Опубликовано 8 января, 2007 Автор Жалоба Поделиться Опубликовано 8 января, 2007 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 и все компилировалось нормально!!! Цитата Ссылка на комментарий Поделиться на другие сайты Поделиться
Ineu Опубликовано 8 января, 2007 Жалоба Поделиться Опубликовано 8 января, 2007 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, но в другой ОС. Все работает. ДЕЙСТВИЕ 5 То же, что и 2 Цитата Ссылка на комментарий Поделиться на другие сайты Поделиться
armix Опубликовано 9 января, 2007 Автор Жалоба Поделиться Опубликовано 9 января, 2007 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, но в другой ОС. Все работает. ДЕЙСТВИЕ 5 То же, что и 2 Все понятно спасибо! Цитата Ссылка на комментарий Поделиться на другие сайты Поделиться
Рекомендуемые сообщения
Присоединяйтесь к обсуждению
Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.