различия между библиотеками C ++ (пространства имен, ссылки) - PullRequest
2 голосов
/ 16 декабря 2010

Я только изучаю C ++ и начал использовать разные библиотеки, такие как Boost и SDL. После первых попыток настроить пути, теперь все выглядит нормально, но у меня все еще есть вопросы о том, почему разные библиотеки работают по-разному.

  1. Почему многие библиотеки (например, Boost) разделены в пространстве имен, а другие (например, SDL) - нет? Для меня более логично держать все разделенными, так как одна библиотека не может знать, какие функции используются в других библиотеках. Но тогда почему SDL не такой?

  2. Почему я должен вручную устанавливать настройки компоновщика (.lib-файлов) почти для каждой библиотеки, в то время как он автоматически для других (например, Boost)? Это из-за того, что я использовал установщик BoostPro, что сделало этот поиск ссылок автоматическим? Или есть какие-то другие настройки, которые я пропустил? Можно ли сделать автоматический поиск файлов .lib для других библиотек?

Ответы [ 2 ]

10 голосов
/ 16 декабря 2010
  1. SDL был написан на C , а язык C изначально не поддерживает пространства имен. Boost является библиотекой только для C ++ и в полной мере использует пространства имен C ++.

  2. Boost - это в основном библиотека только для заголовков, поэтому в большинстве случаев нет реальных двоичных файлов, которые можно связать. При наличии бинарных файлов для связывания (например, Boost.Thread) заголовки могут использовать преимущества специфичных для компилятора директив, которые могут дать команду компоновщику связываться с определенными библиотеками (например, #pragma comment(lib, ...) в VC ++). Эта функция называется «автоматическая ссылка» в контексте Boost. В противном случае библиотеки должны быть специально упомянуты компоновщику.

2 голосов
/ 16 декабря 2010
  1. Технически, SDL - это библиотека C.Поскольку в C нет пространств имен, SDL их не использует.Тот факт, что C ++ (в основном) обратно совместим с C, означает, что вы все равно можете использовать SDL в C ++.Кроме того, SDL использует «эквивалент» пространств имен C: все его функции начинаются с SDL, эффективно создавая некоторое пространство имен.требуют ссылки, так как они только для заголовка.Хотя я могу ошибаться в этом.

...