Когда / почему символы libstdc ++ и libc ++ несовместимы? - PullRequest
0 голосов
/ 21 ноября 2018

Настройка:

test.cpp

#include <set>
#include <string>

void common_config_file_iterator(const std::set<std::string>& allowed_options) {}

include.cpp

#include <set>
#include <string>

void common_config_file_iterator(const std::set<std::string>&) noexcept;

int main() {
    std::set<std::string> set;
    common_config_file_iterator(set);
    return 0;
}

test.sh

clang++-7 test.cpp -c -O3 -fno-rtti -fno-exceptions -o test.o
g++-8 test.o include.cpp -O3 -fno-rtti -fno-exceptions -o test

Выход:

Undefined symbols for architecture x86_64:
  "common_config_file_iterator(std::set<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::less<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > >, std::allocator<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > > > const&)", referenced from:
      _main in ccWoGgrX.o
ld: symbol(s) not found for architecture x86_64
collect2: error: ld returned 1 exit status

Так я и сделал nm -g test.o:

0000000000000000 T __Z27common_config_file_iteratorRKNSt3__13setINS_12basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEEENS_4lessIS6_EENS4_IS6_EEEE

Согласно demangler.com , это значит:

common_config_file_iterator(std::__1::set<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >, std::__1::less<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > >, std::__1::allocator<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > > > const&)

Libc ++ говорит :

[Возможности и цели:] Совместимость ABI с libstdc ++ gcc для некоторых низкоуровневых функций, таких как объекты исключений, rtti и распределение памяти.

Итак, проблема std::allocator<char>?

Обратите внимание, что я использую ассемблер macOS.

Любопытство, вызванное этой проблемой и boost / program-опции .

1 Ответ

0 голосов
/ 23 ноября 2018

Итак, в чем проблема std::allocator<char>?

Что?Это все в вашем примере.

В цитируемом вами документе ясно сказано, что целью является совместимость для "низкоуровневых функций, таких как объекты исключений, rtti и выделение памяти".

std::set и std::string не являются «низкоуровневыми функциями, такими как объекты исключений, rtti и распределение памяти».Они совершенно определенно не совместимы между libc ++ и libstdc ++, которые являются совершенно разными библиотеками с совершенно разными реализациями.

Совместимые части - это такие вещи, как std::type_info и std::exception (и производные типы исключений в <stdexcept>) потому что они являются частью базовой языковой среды выполнения.Все, что выше этого, например контейнеры, строки, алгоритмы, операции ввода-вывода, локали и т. Д., Несовместимо.

...