Andrei
Да. Имя.
Andrei
Но это на си
Andrei
На си++ эта функция в таблице экспорта будет называться как то типа ifoo@2(void)
Andrei
Или еще кака-то такая хрень
Andrei
А если она лежит внутри неймспейса то еще и имя неймспейса
Andrei
А бедный компилятор искал foo
Andrei
Вот эта хрень которая добавляется к имени функции в плюсах это называется mangling
Andrei
Поэтому между двух плюсовых файлов линковщик ищет функции с mangled именами
Andrei
Но если ты хочешь к плюсовому файлу прилинковать сишный
Andrei
Тебе надо сообщить линковщику, что чувак, ищи не ifoo@2 а ищи _foo
Andrei
Потому что это линковка с сишным объектником.
Andrei
Об этом "С" и говорит после слова "extern"
Andrei
Как тут правильно еще заметили есть такая вещь как ABI это совместимость на бинарном уровне(application binary interface)
Andrei
Здесь речь просто о том что на разных платформах и разных реализациях компиляторов и между ними И так далее есть разные соглашения о том как передавать параметры в функцию в каком порядке как возвращать результат и куча тонкостей еще
Andrei
Чтобы ты мог прилинковать одну функцию в другую тебе надо сделать это правильно. В соответсвии с ABI
Andrei
В общем внутри плюсов или внутри сишки или внутри чего еще угодно это делается само
Andrei
Но между разными языками надо быть осторожным.
Andrei
В общем ты напрмер можешь прилинковать в сишную программу и функцию из паскаля
Sergey
В паскале fastcall, вроде
Andrei
Но в паскале другой calling conventions, т е то очем выше гвоорил порядок передачи пргументов и прочее. И чтобы линкер и компилятор не проебались надо писать вот такие вещи
Sergey
А в си cdecl
Andrei
В паскале __pascal :D
Sergey
A lol
Andrei
Хотя не очень актуально в 2016 году.
Ned
кхм
Ned
ты неплохо объясняешь
Ned
а что ещё можно сказать в виде extern X {...}
Ned
?
Andrei
Кажется ничего кроме "C" который обслуживает си и ассемблер и "C++" который обслуживает плюсы нет
Andrei
В стандарте
Andrei
Но в некоторых компиляторах я знаю есть extern "Pascal" и extern "COM+"
Ned
Ned
окай
Ned
понял
Ned
чтож, огромное спасибо
Ned
а ещё такой вот вопрос
Ned
если у нас хедеры хранятся в линуксе преимущественно в /usr/include, то где хранятся их объектники и откуда линкер знает, что откуда с чем линковать?
Stanislav
обычно все объектники объединены в .lib файлы (.a, .la в линкусе)
Andrei
Ага. И хранятся по большей части в /usr/lib
Ned
как понять "объединены"?
Andrei
А линкер знает это потому что у нег есть системная переменная ld_path
Andrei
Или как-то так.
Ned
в окружении такой нету
Andrei
LDLIBRARYPATH
Andrei
С подчеркиваниями
Andrei
По-моему. Я не линуксоид могу ошибаться.
Ned
хорошо
Ned
теперь ясно
Andrei
Объединены в том смысле что они скомпонованы в библиотеку.
Andrei
То есть просто представь как если бы ты собирал свою программу, но без main
Ned
ну да, я понял
Ned
gcc -c
Andrei
Это просто скомпилированные и слинкованные между собой функции которые экспортируются наружу.
Ned
да, без компоновки
Stanislav
не совсем, LD_LIBRARY_PATH указывает где искать .so файлы
Stanislav
уже при запуске программы
Andrei
Ну, справедливости ради там есть компоновка кое-какая, но не полная. Там компоновка ровно та, которую можно статически провести.
Andrei
Да, вот Станислав меня поправит.
Ned
а кто мне скажет, правильно ли я понимаю, что .so линкуются в runtime, а объектники библиотек нужны для статической линковки
Ned
так жи?
Andrei
@crackedmind в линуксах статические либы резолвятся как-то иначе?
Andrei
так жи?
Типа того.
Andrei
То что взято было из ститеской либы навсегда остается в программе
Andrei
А динамическая линковка берет код в рантайме.
Ned
то есть чтобы написать либу, я должен сделать сначала cpp с описанием функций, затем .h с их объявлениями, затем скомпилить в объектник и положить куда надо и затем сделать .so и положить куда надо. верно?
Andrei
Достаточно будет только .h и .so
Andrei
so уже в себе содержит все из объектника.
Ned
ну.... тогда программы, использующие либу попадают в зависимость. или можно сказать gcc —static и он прилинкует код нужных функций из .so статически?
Andrei
Но вообще можно даже обойтись только одним .so потому что в нем есть список экспорта. Но там могут быть проблемы с пользовательскимии типами. Не забивай голову. В общем случае да .h и либа
Andrei
Ох. Я вот кстати не знаю можно ли так делать.
Andrei
Кажется нет.
Andrei
Да. Скорее всего нельзя.
Stanislav
нет, в любом случае нужен статическая либа
Ned
просто если пишешь для железяки, то надо, чтобы вся прога была одним бинарником который закидывается ей в память. без либ и извратов.
Ned
нет, в любом случае нужен статическая либа
то есть в итоге надо иметь .h, .o и .so?
Stanislav
.h, .a & .so :) так точнее
Andrei
нет, в любом случае нужен статическая либа
Ну в теории я знаю как на винде извращнуться и статически прилинковать динамический код.
Stanislav
причем .a для шареда и для статической линковки отличаются
Andrei
Смотри ned. Там просто дело в том, что нужен код, который динамическую библиотеку подгрузит