armix
-
Постов
4 -
Зарегистрирован
-
Посещение
Никогда
Сообщения, опубликованные armix
-
-
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 и все компилировалось нормально!!!
-
Привести исходник не могу, могу лишь более подробно все описать!
Итак, мы имеем некий 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 - там все сработало и нормально скомпилировало!
-
Есть некая программа на срр, я ее компилировал у себя на локальном Линухе и полученный файл a.out прекрасно работает там же!
Затем я перенес этот файл на хостинг моего провайдера - там он не пашет выдает синтаксическую ошибку!
Перекомпиляцией исходника на сервере провайдера - полученный a.out работает прекрасно!
Вопрос, почему не работал первый, скомпилированный у меня файл на сервере провайдера?
Надо обязательно компилит по новой для другого Линукса?
Разве полученный файл не бинарник, который должен работать на любом Линуксе?
Как использовать скомпилированную программу на cpp на другом сервере?
в Программирование: C / C++
Опубликовано
BSD != Linux != Unix
Понятно?
На www.h10.ru стоял также FreeBSD и все компилировалось нормально!!!
Вы сказали
SERVER2 - сервер провайдера FreeBSD Linux сервер
Об этом и речь.
Теперь по Вашему посту. Вводный курс:
Компиляция состоит из двух этапов:
1. Создание объектного файла, то есть заготовки бинарника.
2. Линковка, то есть связывание полученного объектного файла с системными библиотеками.
До первого этапа у нас есть текстовый исходник, который, разумеется, в принципе является кроссплатформенным. После первого этапа получаем объектный файл, причем специфичного для системы формата. После второго получаем бинарник, связанный с конкретными версиями библиотек. Теперь, что происходило с Вашими файлами.
ДЕЙСТВИЕ 1
Вы взяли исходный код, собрали родной для системы объектный файл, после чего слинковали его с соотв. библиотеками. Все работает.
ДЕЙСТВИЕ 2
Вы копируете исполняемый файл ELF в систему FreeBSD, которая использует совершенно другой формат объектных файлов. Ничего не работает.
ДЕЙСТВИЕ 3
То же, что и 2, но теперь это не бинарник, а объектный файл, что сути не меняет.
ДЕЙСТВИЕ 4
То же, что и 1, но в другой ОС. Все работает.
ДЕЙСТВИЕ 5
То же, что и 2
Все понятно спасибо!