LINUX.ORG.RU

Clang может слинковать с boost'ом скомпилированным gcc

 , ,


0

3

В системе установлен boost 1.62 собранный, как это не удивительно gcc. Так же стоит clang 3.9.1 И есть простая программка:

#include <boost/regex.hpp>

int checkStringForSystem( const char * inString ) {
        if ( inString == NULL ) {
                return 0;
        }
        if ( boost::regex_match( inString, boost::regex( "[a-zA-Z0-9,./ ]*" ) ) ) {
                return 0;
        }
        return -1;
}

int main(){
    return checkStringForSystem( "test string" );
}
И при компиляции получаю ошибку линковки:
$ clang++ -O2 -g -DNDEBUG -fPIC -Wall -Wextra -Werror -Wno-unused-function -Wno-unused-parameter -Wno-write-strings -std=gnu++14 -l boost_regex-mt test2.cpp 
/tmp/test2-d0f691.o: In function `boost::cpp_regex_traits<char>::transform[abi:cxx11](char const*, char const*) const':
/usr/include/boost/regex/v4/cpp_regex_traits.hpp:962: undefined reference to `boost::re_detail_106200::cpp_regex_traits_implementation<char>::transform[abi:cxx11](char const*, char const*) const'
/tmp/test2-d0f691.o: In function `boost::cpp_regex_traits<char>::transform_primary[abi:cxx11](char const*, char const*) const':
/usr/include/boost/regex/v4/cpp_regex_traits.hpp:966: undefined reference to `boost::re_detail_106200::cpp_regex_traits_implementation<char>::transform_primary[abi:cxx11](char const*, char const*) const'
clang-3.9: error: linker command failed with exit code 1 (use -v to see invocation)
А если я убираю -O2, то всё собирается нормально.

Да, g++ с теми же параметрами -O2 отрабатывает нормально.

Вопрос, кто-нибудь с таким сталкивался и как бы это обойти?

PS Предваряя вопрос, от шланга отказаться не могу, т.к. надо собрать одно софтень которая заточена на него и gcc не собирается.

★★★★★

Последнее исправление: WatchCat (всего исправлений: 1)

Делу это не поможет, но gcc и clang "-O2" немного разные. А почему используется "-std=gnu++14", а не "-std=c++14"?

grem ★★★★★
()
Ответ на: комментарий от grem

А почему используется "-std=gnu++14", а не "-std=c++14"?

Так в той софтине что надо собрать используют.
Но на самом деле разницы не заметил. Ошибка в обоих случаях.

WatchCat ★★★★★
() автор топика
Ответ на: комментарий от evilface

Пересобрать нужные части буста шлангом и таскать с собой не вариант?

Не хотелось бы.
Я собственно свой gentoo-оверлей собираю с нужным мне софтом.
Хотя конечно как крайний вариант таскать везде собранный бинарник.

WatchCat ★★★★★
() автор топика
Ответ на: комментарий от WatchCat

Попробуй test2.cpp поставить перед -l boost_regex-mt. Вдруг на порядок линковки повлияет.

grem ★★★★★
()
Последнее исправление: grem (всего исправлений: 1)

Это известная проблема несовместимости ABI которая на лоре уже поднималась https://developers.redhat.com/blog/2015/02/05/gcc5-and-the-c11-abi/ https://bugs.llvm.org//show_bug.cgi?id=23529 https://stackoverflow.com/questions/33368237/undefined-reference-in-clang-whe...

SZT ★★★★★
()
Последнее исправление: SZT (всего исправлений: 1)

пересобери буст шлангом. чай не 2000 год. Займет каких-то минут 10

anonymous
()
Ответ на: комментарий от SZT

Я тоже нашёл ссылку на какой-то баг (в удалённых), но не совсем понял, исправили они его для очередной версии игры ли нет. Может снова что-то сломалось в очередном abi.

grem ★★★★★
()
Ответ на: комментарий от WatchCat

Пересобрать нужные части буста шлангом и таскать с собой не вариант?

Не хотелось бы.

Либо ты используешь системный компилятор, либо ты таскаешь все пересобранные библиотеки. Даже если ты взял тот же компилятор, но другой версии, надо все нужное пересобирать. Другого не дано, если, конечно, ты занимаешь худо бедно серьёзным, а не с пиписькой играешь.

vtVitus ★★★★★
()
Ответ на: комментарий от vtVitus

Хорошо что в Си таких проблем нет

SZT ★★★★★
()
Ответ на: комментарий от vtVitus

Ну видать придётся патчить софт на совместимость с g++.
Т.к. я и у g++ баг нашёл. :\

WatchCat ★★★★★
() автор топика
Ответ на: комментарий от DELIRIUM

Софт, как я уже сказал, не мой.
У меня нет времени так глубоко его переписывать, что бы отвязать от буста. Там же не только regexp используется, а где-то 2/3 библиотек из него.

WatchCat ★★★★★
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.