Я изучаю независимый от платформы код и нашел упоминание об API dlfcn.Впервые я упомянул об этом и провел дальнейшие исследования.Теперь, надеюсь, мое отсутствие опыта / понимания кода, независимого от платформы, а также компиляции / компоновки не будет показано в этом посте, но для меня API dlfcn просто позволяет нам делать то же динамическое связывание программно, что и утилита ld.Если у меня есть неправильные представления, поправьте меня, как я хотел бы знать.Что касается того, что я знаю об утилите ld и API dlfcn, у меня есть несколько вопросов.
Каковы преимущества использования утилиты ld по сравнению с API dlfcn для динамического связывания?
Моей первой мыслью было, что API dlfcn кажется пустой тратой моего времени, поскольку мне нужно запрашивать указатели на функции вместо того, чтобы ld проверял таблицу символов на наличие неопределенных символов и затем связывал их.Точно так же ld делает все для меня, в то время как я должен делать все вручную с помощью API dlfcn (т.е. открыть / загрузить библиотеку, получить указатель на функцию, закрыть библиотеку и т. Д.).Но на второй взгляд я подумал, что здесь могут быть некоторые преимущества.Одним из них является то, что мы можем загрузить библиотеку из памяти после того, как мы покончим с этим.
Таким образом, память может быть сохранена, если мы знали, что нам не нужно использовать библиотеку все время.Я не уверен, есть ли какое-либо управление "память / библиотека" для библиотек, динамически связанных с ld?Точно так же я не уверен в том, какие сценарии / среды нам было бы интересно использовать API dlfcn для сохранения упомянутой памяти, так как кажется, что это не будет проблемой в современных системах.Полагаю, можно использовать библиотеку в системе с очень очень очень ограниченными ресурсами (может быть, со встроенной системой?).
Какие еще могут быть преимущества или недостатки?
Какой «шаблон кодирования» используется для кода, независимого от платформы, в отношении динамического связывания?
Если бы я делал код, независимый от платформы, который зависел от системных вызовов, я мог бы видеть, как я добивался кода, независимого от платформы, кодируя водин из трех стилей:
- Логическое ветвление непосредственно в коде моей библиотеки через макросы.Примерно так:
- Создание общих функций системного вызова и использование их в коде моей библиотеки.Примерно так:
- Аналогично одному, но добавить слой абстракции с помощью API dlfcn
Какие из них обычно используются и почему?И если есть какие-либо другие, которые не указаны в списке и предпочли мой, пожалуйста, дайте мне знать.
Спасибо за чтение этого поста.Я буду держать его в курсе, чтобы он мог послужить справочной информацией в будущем.