
Andrei
16.04.2016
23:21:35
В этом файле есть функция с сигнатурой int foo(void)

Ned Ogl
16.04.2016
23:21:42
ну имя, адрес и параметры, что логично

Andrei
16.04.2016
23:21:52
И тода линкер прросматривая по порядку объектник. Её найдет
Да. Имя.

Google

Andrei
16.04.2016
23:22:01
Но это на си
На си++ эта функция в таблице экспорта будет называться как то типа ifoo@2(void)
Или еще кака-то такая хрень
А если она лежит внутри неймспейса то еще и имя неймспейса
А бедный компилятор искал foo
Вот эта хрень которая добавляется к имени функции в плюсах это называется mangling
Поэтому между двух плюсовых файлов линковщик ищет функции с mangled именами
Но если ты хочешь к плюсовому файлу прилинковать сишный
Тебе надо сообщить линковщику, что чувак, ищи не ifoo@2 а ищи _foo
Потому что это линковка с сишным объектником.
Об этом "С" и говорит после слова "extern"
Как тут правильно еще заметили есть такая вещь как ABI это совместимость на бинарном уровне(application binary interface)
Здесь речь просто о том что на разных платформах и разных реализациях компиляторов и между ними И так далее есть разные соглашения о том как передавать параметры в функцию в каком порядке как возвращать результат и куча тонкостей еще

Google

Andrei
16.04.2016
23:27:12
Чтобы ты мог прилинковать одну функцию в другую тебе надо сделать это правильно. В соответсвии с ABI
В общем внутри плюсов или внутри сишки или внутри чего еще угодно это делается само
Но между разными языками надо быть осторожным.
В общем ты напрмер можешь прилинковать в сишную программу и функцию из паскаля

Сергей
16.04.2016
23:28:53
В паскале fastcall, вроде

Andrei
16.04.2016
23:28:58
Но в паскале другой calling conventions, т е то очем выше гвоорил порядок передачи пргументов и прочее. И чтобы линкер и компилятор не проебались надо писать вот такие вещи

Сергей
16.04.2016
23:29:02
А в си cdecl

Andrei
16.04.2016
23:29:12
В паскале __pascal :D

Сергей
16.04.2016
23:29:24
A lol

Andrei
16.04.2016
23:29:27
Хотя не очень актуально в 2016 году.

Ned Ogl
16.04.2016
23:29:55
кхм
ты неплохо объясняешь
а что ещё можно сказать в виде extern X {...}
?

Andrei
16.04.2016
23:32:20
Кажется ничего кроме "C" который обслуживает си и ассемблер и "C++" который обслуживает плюсы нет
В стандарте
Но в некоторых компиляторах я знаю есть extern "Pascal" и extern "COM+"

Ned Ogl
16.04.2016
23:32:52
окай
понял

Google

Ned Ogl
16.04.2016
23:33:20
чтож, огромное спасибо
а ещё такой вот вопрос
если у нас хедеры хранятся в линуксе преимущественно в /usr/include, то где хранятся их объектники и откуда линкер знает, что откуда с чем линковать?

Stanislav
16.04.2016
23:35:04
обычно все объектники объединены в .lib файлы (.a, .la в линкусе)

Andrei
16.04.2016
23:35:32
Ага. И хранятся по большей части в /usr/lib

Ned Ogl
16.04.2016
23:35:43
как понять "объединены"?

Andrei
16.04.2016
23:35:57
А линкер знает это потому что у нег есть системная переменная ld_path
Или как-то так.

Ned Ogl
16.04.2016
23:36:16
в окружении такой нету

Andrei
16.04.2016
23:36:31
LDLIBRARYPATH
С подчеркиваниями
По-моему. Я не линуксоид могу ошибаться.

Ned Ogl
16.04.2016
23:37:04
хорошо
теперь ясно

Andrei
16.04.2016
23:37:18
Объединены в том смысле что они скомпонованы в библиотеку.
То есть просто представь как если бы ты собирал свою программу, но без main

Ned Ogl
16.04.2016
23:37:45
ну да, я понял
gcc -c

Andrei
16.04.2016
23:38:05
Это просто скомпилированные и слинкованные между собой функции которые экспортируются наружу.

Ned Ogl
16.04.2016
23:38:11
да, без компоновки

Google

Stanislav
16.04.2016
23:38:19
не совсем, LD_LIBRARY_PATH указывает где искать .so файлы
уже при запуске программы

Andrei
16.04.2016
23:38:52
Ну, справедливости ради там есть компоновка кое-какая, но не полная. Там компоновка ровно та, которую можно статически провести.
Да, вот Станислав меня поправит.

Ned Ogl
16.04.2016
23:39:03
а кто мне скажет, правильно ли я понимаю, что .so линкуются в runtime, а объектники библиотек нужны для статической линковки
так жи?

Andrei
16.04.2016
23:40:18
@crackedmind в линуксах статические либы резолвятся как-то иначе?
То что взято было из ститеской либы навсегда остается в программе
А динамическая линковка берет код в рантайме.

Admin
ERROR: S client not available

Ned Ogl
16.04.2016
23:41:35
то есть чтобы написать либу, я должен сделать сначала cpp с описанием функций, затем .h с их объявлениями, затем скомпилить в объектник и положить куда надо и затем сделать .so и положить куда надо. верно?

Stanislav
16.04.2016
23:41:37

Andrei
16.04.2016
23:42:12
Достаточно будет только .h и .so
so уже в себе содержит все из объектника.

Ned Ogl
16.04.2016
23:43:10
ну.... тогда программы, использующие либу попадают в зависимость. или можно сказать gcc —static и он прилинкует код нужных функций из .so статически?

Andrei
16.04.2016
23:43:54
Но вообще можно даже обойтись только одним .so потому что в нем есть список экспорта. Но там могут быть проблемы с пользовательскимии типами. Не забивай голову. В общем случае да .h и либа
Ох. Я вот кстати не знаю можно ли так делать.
Кажется нет.
Да. Скорее всего нельзя.

Google

Stanislav
16.04.2016
23:44:49
нет, в любом случае нужен статическая либа

Ned Ogl
16.04.2016
23:45:02
просто если пишешь для железяки, то надо, чтобы вся прога была одним бинарником который закидывается ей в память. без либ и извратов.

Stanislav
16.04.2016
23:45:46
.h, .a & .so :) так точнее

Andrei
16.04.2016
23:45:48

Stanislav
16.04.2016
23:46:05
причем .a для шареда и для статической линковки отличаются

Andrei
16.04.2016
23:46:49
Смотри ned. Там просто дело в том, что нужен код, который динамическую библиотеку подгрузит

Ned Ogl
16.04.2016
23:47:10
если ты собираешься зависеть от либы и линковать её динамически во время runtime, нужно ли в коде напрямую делать dlopen()?

Andrei
16.04.2016
23:47:13
И вот он то и находится в статической либе, которая нужна чтобы использовать динамическую.

Ned Ogl
16.04.2016
23:47:32
а, ну я вот как раз за этот код и спрашиваю

Andrei
16.04.2016
23:47:54
Вот. Можно либо так да, либо когда делаешь свою шареную либу еще делать к ней маленький статический лоадер

Ned Ogl
16.04.2016
23:48:01
то есть, если будешь зависеть от .so, тебе нужно сначала его dlopen() а потом использовать функции?
понял
все

Andrei
16.04.2016
23:48:07
Вернее за тебя это сейчас компиляторы делабт.

Ned Ogl
16.04.2016
23:48:42
ну да, ведь libstdc++ тоже по идее .so, но явно я её не подгружаю

Andrei
16.04.2016
23:48:50
Угу.

Ned Ogl
16.04.2016
23:48:58
вроде бы и qt не подгружают явно
хорошо
что будет, если скачать из винды noname.dll и сделать во время runtime с ней dlopen?

Andrei
16.04.2016
23:49:35
Это делает код внутри статических либ, который вот кстати как раз вызывается перед main

Ned Ogl
16.04.2016
23:49:37
архитектура та же, API не затрагивается

Andrei
16.04.2016
23:49:52
Разные abi ничего не выйдет