Lib файлы и определения - PullRequest
3 голосов
/ 19 марта 2011

Я использую пару внешних библиотек, и я бы предпочел не включать все их исходные и заголовочные файлы в мою основную исходную директорию или в файл моего проекта.Один из вариантов - скомпилировать библиотеки как файлы lib и связать их вот так.Однако Я не уверен, что определения оцениваются до или после создания файла lib (какой это?) .Если раньше, то, очевидно, я не могу просто упаковать их, потому что они могут не работать должным образом на разных компиляторах или системах.

Так что, если я не могу упаковать библиотеки как файлы lib, есть ли способ для меняссылка в исходных файлах c или cpp?Вероятно, нет, так как они должны быть скомпилированы в первую очередь, но, возможно, я ошибаюсь.

Редактировать: Вот дополнительный вопрос, основанный на ответах.Как вы думаете, было бы слишком хлопотно иметь make-файл, который создает файлы lib?Я бы все же не стал добавлять исходники в мой проект или в каталог исходных текстов.

Ответы [ 2 ]

3 голосов
/ 19 марта 2011

Библиотека - это двоичный файл, поэтому все, очевидно, уже определены.

Просто для того, чтобы упорядочить, определения оцениваются как 1-й этап процесса компиляции - этот шаг называется предварительным процессом. На этом этапе для каждого файла cpp создается один файл, содержащий все #include ', которые были в нем, рекурсивно и все макросы оцениваются.

В любом случае сторонние разработчики не должны зависеть от ваших флагов компиляции с одним исключением - release / build lib. Только в этом случае вам нужны 2 версии 3-й библиотеки.

Что касается вопроса о том, нужно ли компилировать сторонние библиотеки один или каждый раз во время компиляции вашего кода, это зависит. Если вы делаете это только для себя, чем делаете то, что вам кажется легким для вас, но если мы говорим о команде разработчиков и проекте, который будет поддерживаться в течение длительного времени, то нужно учитывать больше вещей.

Итак, мы говорим о каком-то надежном решении для команды и хотим несколько раз скомпилировать библиотеку.

В этом случае я лично стараюсь собрать библиотеку третьей части один раз и использовать ее много раз. Это сокращает время компиляции для каждой сборки для каждого разработчика, что означает более быструю разработку.

Хорошо, но где вы держите этих библиотек? Мне нравится физическое разделение - сторонняя библиотека и мой код не в одном дереве. Это может избежать некоторых неумышленных ошибок. Хорошая система сборки, и в большинстве случаев она обязательна, должна быть перестраиваемой. Это означает, что если вы извлекаете код из года в год, вы можете компилировать и получать точно такие же двоичные файлы.

Однажды я использовал какое-то внешнее дерево только для чтения на моей машине. Этим деревом управлял только я. Для того, чтобы мои исходные коды можно было перестраивать, каждая следующая версия сторонней библиотеки помещала в директорию, содержащую ее версию, и мое дерево исходных текстов было обновлено, чтобы указывать на этот момент. Если вы работаете на нескольких машинах, то дерево только для чтения должно быть видно на всех этих машинах.

Дополнительное решение состоит в том, чтобы проверить, дает ли ваш инструмент SCM (я полагаю, вы его используете) некоторую возможность объединить несколько подпробований из репозитория в одной проверке. Для каждой сторонней библиотеки есть одно поддерево. Таким образом, сторонние библиотеки доступны на всех машинах вашей сборки. В настоящее время я использую этот метод на Subversion - он называется SVN: внешний. На CVS AFAIK это называется cvs modules. Дополнительным преимуществом является то, что библиотеки управляются системой контроля версий, поэтому вы можете отслеживать все изменения, сделанные в сторонних библиотеках.

2 голосов
/ 19 марта 2011

define s оценивается еще до компиляции . Они обрабатываются препроцессором, который подготавливает код для использования компилятором. Так что да, они оцениваются до создания библиотек.

Вы не можете связать с исходным кодом. Вы можете связывать только объектные файлы, статические библиотеки или динамические библиотеки (общие объектные файлы / DLL).

Использование динамической компоновки может быть хорошим вариантом, особенно если внешние размеры велики и / или вы будете использовать их во многих исполняемых файлах.

...