Как сделать кросс-компиляцию статической библиотеки, созданной на цели, со статической связью, используя утилиты c ++ 11 - PullRequest
0 голосов
/ 14 сентября 2018

** Редактировать: нашел мою проблему. Как объясняется в следующем ответе, я не делал никаких ссылок при создании статической библиотеки. Вместо этого я создал общую библиотеку и статически связал 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) ' неопределенная ссылка на станд :: __ throw_regex_error (СТД :: 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 не статически связаны со статической библиотекой. Я думаю, мне нужно знать, почему это так, чтобы решить эту проблему.

...