Как сделать кросс-компиляцию статической библиотеки, созданной на цели, со статической связью с использованием утилит C++11

** Редактировать: нашел мою проблему. Как объясняется в следующем ответе, я не делал никаких ссылок при создании статической библиотеки. Вместо этого я сделал общую библиотеку и статически связал libstdC++.

Скомпилировать статическую библиотечную ссылку со стандартной библиотекой (статической)**

Я пытаюсь создать метод для использования C++11 на древней платформе arm под управлением ядра (2.6.37). К сожалению, последняя кросс-компиляция, которую содержит наш BSP, - это GCC 4.5.3, которая не поддерживает все необходимые нам утилиты C++11.

Сначала я пытался использовать старые версии crosstool-ng для создания кросс-компилятора, но старые версии были слишком сломаны. Более новые версии не поддерживали ядро ​​2.6.37. Я смог завершить одну сборку, однако двоичный файл g++ не был собран, что сделало все усилия бесполезными (я проверил, что C++ был включен в menuconfig).

Таким образом, мой последний вариант состоял в том, чтобы изначально собрать gcc в версии 4.9.4 и создать статически связанную библиотеку, чтобы моя кросс-компилятор gcc 4.5.3 имел ссылки. Кажется, это работает по большей части. Я создаю свою библиотеку на цели с помощью следующего:

g++ -std=c++11 --static -c main2.cpp
ar -cvq libmain2.a main2.o

Затем я копирую файлы и пытаюсь собрать на хост-машине gcc 4.5.3 и получаю следующее:

arm-angstrom-linux-gnueabi-g++ simple.cpp -lmain2 -L.

(Я убрал часть вывода)

неопределенная ссылка на `std::_Hash_bytes(void const*, unsigned int, unsigned int)'неопределенная ссылка на std::__throw_regex_error(std::regex_constants::error_type)'

Однако, когда я использую nm, я получаю следующее:

    $ arm-angstrom-linux-gnueabi-nm libmain2.a | grep Hash_bytes
     U _ZSt11_Hash_bytesPKvjj
     U _ZSt11_Hash_bytesPKvjj
    $ arm-angstrom-linux-gnueabi-nm libmain2.a | grep throw_regex
     U _ZSt19__throw_regex_errorNSt15regex_constants10error_typeE
     U _ZSt19__throw_regex_errorNSt15regex_constants10error_typeE

Кто-нибудь знает, что, черт возьми, происходит? К сожалению, нам нужно иметь возможность использовать наш кросс-компилятор на хост-системе для большей части работы, но нам также нужно интегрировать эту конкретную библиотеку, которая использует C++11.

Также обратите внимание, что если я извлекаю из своего кода функциональность regex и hash, но оставляю другие концепции C++11, такие как nullptr, вывод типа, делегирование и т. Д., Код компилируется и выполняется в целевом порядке.

Редактировать: Хорошо, так что после небольшого исследования, похоже, что функции _Hash_bytes и __throw_regex_error не статически связаны со статической библиотекой. Я думаю, мне нужно знать, почему это так, чтобы решить проблему.

0 ответов

Другие вопросы по тегам