Не удается запустить исполняемый двоичный файл в другой системе Linux? - PullRequest
6 голосов
/ 25 мая 2010

Я использую Ubuntu 10.04 и Qt4.6 и создал исполняемый двоичный файл на своем компьютере через QtCreator.

Теперь я хочу поместить свой исполняемый файл в CentOS 5, но похоже, что этот исполняемый файл не может работать в CentOS.

Сообщение об ошибке:

bash: ./[filename]: cannot execute binary file

Теперь я знаю, что это происходит из-за 32-битной и 64-битной проблемы, и успешно создаю 32-битный исполняемый файл.

Однако этот исполняемый файл все еще не может быть запущен в CentOS из-за проблемы с динамической связью, он всегда показывает, что:

Error while loading shared libraries: libQtGUI.so.4: cannot open shared object file: No such file or directory

Я пытался добавить флаг "-static" в .pro файл

QMAKE_CFLAGS_RELEASE    += -Os -static
QMAKE_CPPFLAGS_RELEASE  += -Os -static
QMAKE_CXXFLAGS_RELEASE  += -Os -static
QMAKE_CCFLAGS_RELEASE   += -Os -static

однако, похоже, что он генерирует только «статический двоичный код», но не «статически связанный», зависимость все еще существует.

Я также попытался добавить следующую строку в файл .pro:

QMAKE_LFLAGS += static

Но этот проект не может скомпилироваться после этого. У меня нет разрешения на установку Qt в Cent OS. Как я могу скомпилировать этот проект со статической связью, чтобы исполняемый файл мог работать независимо?

Спасибо за вашу помощь!

Ответы [ 3 ]

4 голосов
/ 25 мая 2010

Проверьте 64-битные и 32-битные - file(1) ваш друг здесь. Затем проверьте, какие библиотеки отсутствуют с ldd(1).

Edit:

Взгляните на этот вопрос SO Статическое связывание и развертывание Qt .

2 голосов
/ 25 мая 2010

В общем, всегда плохая идея запускать исполняемый файл из одного дистрибутива в другом. Помимо архитектурных различий (32 против 64 бит), вы также можете столкнуться с несовместимостью библиотек, изменениями ABI и другими забавными вещами. Вы можете избавиться от проблемы с библиотеками, скомпилировав статический двоичный файл, но это имеет и другие недостатки.

Вы должны рассматривать дистрибутивы как свои собственные системы, независимо от того, что все они основаны на ядре Linux, и компилировать двоичные файлы для каждого из тех, которые вы хотите поддерживать. OpenSUSE Build Factory может помочь вам, если ваша цель - предоставить бинарные пакеты.

2 голосов
/ 25 мая 2010

Может быть несколько причин, по которым ваш исполняемый файл не может быть запущен. Однако сначала проверьте зависимости с помощью ldd, чтобы получить подсказку.

...