undefined ссылка на std :: __ cxx11 :: basic_string при соединении с boost [duplicate]

Эта базовая реализация:

function prima($n){

  for($i=1;$i<=$n;$i++){  //numbers to be checked as prime

          $counter = 0; 
          for($j=1;$j<=$i;$j++){ //all divisible factors


                if($i % $j==0){ 

                      $counter++;
                }
          }

        //prime requires 2 rules ( divisible by 1 and divisible by itself)
        if($counter==2){

               print $i." is Prime 
"; } } } prima(20); //find prime numbers from 1-20

Здесь будет выводиться

 2 is Prime 
 3 is Prime 
 5 is Prime 
 7 is Prime 
 11 is Prime 
 13 is Prime 
 17 is Prime 
 19 is Prime 

Полная логика пошаговая и визуальная аналогия здесь: Здесь

56
задан Baum mit Augen 4 May 2018 в 00:49
поделиться

4 ответа

Возможно ли, что вы используете GCC 5?

Если вы получаете ошибки компоновщика о неопределенных ссылках на символы, которые включают типы в пространстве имен std :: __ cxx11 или тег [abi: cxx11 ], то это, вероятно, указывает на то, что вы пытаетесь связать вместе файлы объектов, которые были скомпилированы с различными значениями для макроса _GLIBCXX_USE_CXX11_ABI. Это обычно происходит при подключении к сторонней библиотеке, которая была скомпилирована с более старой версией GCC. Если сторонняя библиотека не может быть перестроена с новым ABI, вам нужно будет перекомпилировать свой код со старым ABI.

Источник: Замечания о выпуске GCC 5 / Dual ABI

Определение следующего макроса перед включением любых стандартных заголовков библиотек должно устранить вашу проблему: #define _GLIBCXX_USE_CXX11_ABI 0

74
ответ дан Matthäus Brandl 16 August 2018 в 01:58
поделиться
  • 1
    Я попробовал это; теперь я получаю ошибки компоновщика везде, где я использую функции c ++ 11. Может быть, нет способа заставить это работать как с c ++ 11, так и с компилируемой библиотекой hdf5. – jorgen 28 October 2015 в 17:06
  • 2
    Для меня, на Ubuntu 14.04, g ++ 6.2 компилируется по умолчанию с этим набором в 0, а в 16.04 - с той же версией g ++, с которой она установлена ​​в 1. На 14.04 установка этого значения в 1, похоже, ничего не делает; результирующий объектный файл не использует ABI CXX11. Я подозреваю, что это системное ограничение. – Devin Lane 29 September 2016 в 07:50
  • 3
    Я не был уверен, почему компилятор бросает undefined reference и перед поиском решения я проверил всю свою связь в программе и ничего не нашел. После этого я решил искать в Интернете и нашел это. Это работает как шарм, спасибо :) – Shravan40 25 October 2016 в 05:44

Я получил это, единственный способ, которым я нашел исправление, - это обновить все mingw-64 (я сделал это с помощью pacman на msys2 для вашей информации).

0
ответ дан ceorron 16 August 2018 в 01:58
поделиться

Если вы можете перекомпилировать все несовместимые библиотеки, которые вы используете, сделайте это с помощью опции компилятора

-D_GLIBCXX_USE_CXX11_ABI = 1

, а затем перестройте свой проект. Если вы не можете этого сделать, добавьте параметр компилятора makefile вашего проекта

-D_GLIBCXX_USE_CXX11_ABI = 0

Определить

#define _GLIBCXX_USE_CXX11_ABI 0/1

также хорош, но вам, вероятно, нужно добавить его ко всем вашим файлам, тогда как опция компилятора сделает это для всех файлов одновременно.

37
ответ дан Denis Sirotkin 16 August 2018 в 01:58
поделиться
  • 1
    Флаг компилятора работал для меня. Благодарю. Я потратил 4 дня на это глупое изменение в gcc! – ray pixar 14 August 2016 в 05:52
  • 2
    Благодарю. Этот флаг также работал для меня – hbobenicio 14 December 2016 в 15:29

Для меня -D_GLIBCXX_USE_CXX11_ABI = 0 не помогло.

Он работает после того, как я связался с версией C ++ libs вместо gnustl.

0
ответ дан dimon4eg 16 August 2018 в 01:58
поделиться
Другие вопросы по тегам:

Похожие вопросы: