Странности линковки статической либы
От: sun2013  
Дата: 28.04.13 23:43
Оценка:
Привет всем!
Есть маленькое консольное тестовое приложение под Mac OS, также есть маленькая тестовая статическая C++ либа тоже под Mac OS. Собирается все в XCode 4.6.2. Компилятор один и тот же — дефолтный Apple LLVM 4.2. Но вот есть разница в результате при следующих настройках использования библиотеки C++.

1. Если
app — libc++
lib — libc++
тогда всё ok

2. Если
app — libstdc++
lib — libc++

тогда всё ok

3. Если
app — libc++
lib — libstdc++

тогда ошибки линковки:
Undefined symbols for architecture x86_64:
"std::ios_base::Init::Init()", referenced from:
___cxx_global_var_init in lib01SampleCppLibrary.a(Test.o)
"std::ios_base::Init::~Init()", referenced from:
___cxx_global_var_init in lib01SampleCppLibrary.a(Test.o)
ld: symbol(s) not found for architecture x86_64
clang: error: linker command failed with exit code 1 (use -v to see invocation)

4. Если
app — libstdc++
lib — libstdc++

тогда всё ok

Так вот вопросы:
1. Чем вообще отличаются эти две либы?
2. Почему не линкуется именно в такой комбинации (3)?
3. Почему в комбинации 2 все линкуется? (проверено несколько раз!)
Re: Странности линковки статической либы
От: kaa.python Ниоткуда РСДН профессионально мёртв и завален ватой.
Дата: 29.04.13 04:01
Оценка: 2 (1)
libstdc++ – является частью GCC. Старая, т.к. GCC на Mac OS X давно не поддерживатся Apple. Хотя, ты мог поставить его из портов, тогда данная библиотека вполне может быть новой.
libc++ – часть Clang. Новая, поддерживается Apple.

Если твой проект использует C++11, то ты должен линковаться с libc++, если нет, то можешь линковаться либо с libstdc++ либо с libc++. Но, ты в любом случае не должен линковаться с двумя библиотеками одновременно, так как два разных рантайма до добра никогда не доводили.
Re[2]: Странности линковки статической либы
От: sun2013  
Дата: 29.04.13 07:24
Оценка:
Здравствуйте, kaa.python, Вы писали:

KP>libstdc++ – является частью GCC. Старая, т.к. GCC на Mac OS X давно не поддерживатся Apple. Хотя, ты мог поставить его из портов, тогда данная библиотека вполне может быть новой.

KP>libc++ – часть Clang. Новая, поддерживается Apple.

А как это не поддерживается GCC?
У меня после установки они оба были в списке выбора компиляторов. Я и под GCC компилить иногда пробую.

KP>Если твой проект использует C++11, то ты должен линковаться с libc++, если нет, то можешь линковаться либо с libstdc++ либо с libc++. Но, ты в любом случае не должен линковаться с двумя библиотеками одновременно, так как два разных рантайма до добра никогда не доводили.


Это понятно, что до добра не доведет, но мне было интересно, почему именно в комбинации 3 не линкуется, и почему линкуется в 2 (хотя там тоже разные рантаймы)?
Re[3]: Странности линковки статической либы
От: kaa.python Ниоткуда РСДН профессионально мёртв и завален ватой.
Дата: 29.04.13 07:35
Оценка: 2 (1)
Здравствуйте, sun2013, Вы писали:

S>А как это не поддерживается GCC?

S>У меня после установки они оба были в списке выбора компиляторов. Я и под GCC компилить иногда пробую.

Последняя версия GCC, поддерживаемая Apple, 4.2. А это еще тот копролит мамонта.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.