2 votes

Raspberry Pi C++11 std::thread : méthode virtuelle pure appelée

Ubuntu 14.04. J'ai installé gcc-arm-linux-gnueabihf, g++-arm-linux-gnueabihf (j'ai essayé 4.8 et 4.9 de utopic).

Code qui utilise std::thread :

#include <iostream>
#include <chrono>
#include <future>

void secondList()
{
    const std::chrono::seconds twoSeconds(2);

    for (size_t i = 0; i != 300; ++i)
    {
        std::this_thread::sleep_for(twoSeconds);
        std::cout << "2s\n";
    }
}

int main(int, const char *[])
{
    auto secondThr = std::async(std::launch::async, secondList);

    return 0;
}

Compilation avec :

arm-linux-gnueabihf-g++ --std=c++11 main.cpp -lpthread -o main

Sur le RPI, il échoue :

pi@raspberrypi ~ $ ./main 
pure virtual method called
terminate called without an active exception
Aborted

La compilation sur le RPI fonctionne :

pi@raspberrypi ~ $ g++ --std=c++0x main.cpp -lpthread -o main

Image Pi 2015-02-16-raspbian-wheezy, g++ sur Pi (Debian 4.6.3-14+rpi1) 4.6.3.

J'ai essayé les options du compilateur -mcpu=cortex-a7 , -mcpu=cortex-a8 y -D__GCC_HAVE_SYNC_COMPARE_AND_SWAP_{1,2,4,8} qui ont été mentionnés dans des questions similaires.

J'ai aussi essayé g++ à partir de l'archive publique : http://ppa.launchpad.net/linaro-maintainers/toolchain/ubuntu précis

Pourquoi cela se produit-il et comment obtenir un compilateur croisé qui fonctionne ?

-1voto

William Points 21

Avec l'image basée sur Jessie, cela fonctionne.

-1voto

albert Points 101

Ajoutez ceci à la ligne de commande pour la liaison,

-Wl,--whole-archive -lpthread -Wl,--no-whole-archive

Voir ce message pour des explications, https://gcc.gnu.org/ml/gcc-help/2010-05/msg00029.html Il semblerait que ce soit un problème de TLS, mais peut-être est-ce lié à des symboles incomplets liés à des fichiers statiques. libpthread .

-1voto

Jeremy Barnes Points 1

Il peut probablement être corrigé en ajoutant -D__GCC_HAVE_SYNC_COMPARE_AND_SWAP_1 -D__GCC_HAVE_SYNC_COMPARE_AND_SWAP_2 -D__GCC_HAVE_SYNC_COMPARE_AND_SWAP_8 aux drapeaux de la ligne de commande.

La cause profonde et la solution sont décrites ici : https://raspberrypi.stackexchange.com/questions/48225/whats-causing-these-crashes-after-cross-compiling

SistemesEz.com

SystemesEZ est une communauté de sysadmins où vous pouvez résoudre vos problèmes et vos doutes. Vous pouvez consulter les questions des autres sysadmins, poser vos propres questions ou résoudre celles des autres.

Powered by:

X