Я использую 32-битную версию Ubuntu 10.10 и пытаюсь выполнить кросс-компиляцию для 64-битной цели. Основываясь на моих исследованиях, я установил пакет g ++ - multilib.
Программа очень проста:
#include <iostream>
int main( int argc, char** argv )
{
std::cout << "hello world" << std::endl;
return 0;
}
Обобщение:
g++ -m64 main.cpp
Ошибка:
In file included from main.cpp:1:
/usr/include/c++/4.4/iostream:39: fatal error: bits/c++config.h: No such file or directory
compilation terminated.
Я нашел c++config.h
файл , но они находятся под i486-linux-gnu
и i686-linux-gnu
каталоги в /usr/include/c++/4.4/
Eсть не c++config.h
в /usr/include/c++/bits
.
Любые идеи о том, что мне не хватает? Компиляция без -m64
флага работает нормально (a.out создан и работает правильно).
Редактировать Благодаря подсказке @nightcracker я немного больше изучил структуру include в 32- и 64-битных системах. Ниже я добавил ответ, который временно «исправляет» проблему, но думаю, что она будет сломана при следующем обновлении. По сути, мне не хватает каталога, /usr/include/c++/4.4/i686-linux-gnu/64
который должен содержать подкаталог bits
с отсутствующим включаемым файлом. Любая идея, какой пакет должен заботиться об этом?
источник
Ответы:
Частично добавив этот ответ, потому что он решил мою проблему с той же проблемой, и поэтому я могу добавить этот вопрос в закладки самостоятельно.
Я смог это исправить, выполнив следующие действия:
Если вы установили версию
gcc
/g++
, которая не поставляется по умолчанию (например, вg++-4.8
lucid), вы также захотите выбрать версию:источник
gcc and g++
установленные в вашей системе. На Ubuntu 14.04 у меня былоgcc-4.8
иg++-4.8
установлено, поэтому я установилgcc-4.8-multilib
иg++-4.8-multilib
вместо этого.sudo apt-get install gcc-multilib g++-multilib
кажется, лучше (он автоматически разрешается в вашей версии gcc).Вы пытались добавить
-I/usr/include/c++/4.4/i486-linux-gnu
или-I/usr/include/c++/4.4/i686-linux-gnu
?источник
При компиляции в RHEL 6.2 (x86_64) я установил как 32-битные, так и 64-битные пакеты libstdc ++ - dev, но у меня возникла проблема «c ++ config.h нет такого файла или каталога ».
Разрешение:
Каталог
/usr/include/c++/4.4.6/x86_64-redhat-linux
отсутствовал.Я сделал следующее:
Теперь я могу скомпилировать 32-битные двоичные файлы на 64-битной ОС.
источник
cd /usr/include/c++/4.6;ln -s x86_64-suse-linux i586-suse-linux
Кажется, это ошибка опечатки в этом пакете gcc. Решение:
источник
В моей 64-битной системе я заметил, что существует следующий каталог:
Тогда будет иметь смысл, что в моей 32-битной системе, которая была настроена для 64-битной кросс-компиляции, должен быть соответствующий каталог, такой как:
Я дважды проверил, и этот каталог не существует. Запуск
g++
с параметром verbose показал, что компилятор действительно что-то ищет в этом месте:Ошибка относительно
ignoring nonexistent directory
была ключом. К сожалению, я до сих пор не знаю, какой пакет мне нужно установить, чтобы показать этот каталог, поэтому я просто скопировал/usr/include/c++/4.4/x86_64-linux-gnu/bits
каталог со своего 64-разрядного компьютера/usr/include/c++/4.4/i686-linux-gnu/64/bits
на мой 32- разрядный компьютер.Теперь компилируем только с
-m64
правильными работами. Основным недостатком является то, что это все еще не правильный способ сделать что-то, и я предполагаю, что в следующий раз, когда Update Manager установит и обновление g ++ может сломаться.источник
Эта ошибка исправлена в "gcc-4.6".
https://bugs.launchpad.net/ubuntu/+source/gcc-4.5/+bug/793411
источник
В основном это используется в HeapOverflows или других проблемах реверсивного типа, т. Е. Если вы хотите изменить 64-битный ELF на 32-битный ELF, и он показывает ошибку при конвертации.
Вы можете просто запустить команды
который обновит ваши библиотеки Обновленные пакеты:
похоже на это будет показано на вашем терминале
источник
Из моего опыта
sudo apt-get install gcc-multilib g++-multilib
помогает. Но моя другая проблема заключается в том, что я забыл очистить каталог, поэтому я все еще получаю ту же ошибку. Это первый раз, чтобы использовать Clang или Cmake. Поэтому я просто удаляю свой исходный каталог и перекомпилирую, и он работает. Надеюсь, это поможет кому-то вроде меня.источник