Чрезмерное включение библиотек C ++ - PullRequest
2 голосов
/ 16 мая 2010

Я читаю о том, как собрать make-файл, но никто, кажется, не упоминает, что делать, если ваши файлы требуют разных наборов библиотек, все они, похоже, используют один и тот же набор библиотек для каждого файла. Поскольку кажется маловероятным, что каждый отдельный файл имеет одинаковые библиотеки, я считаю, что используемый ими список должен объединить все библиотеки, необходимые для всего проекта.

Я просто хотел узнать, есть ли недостаток в том, чтобы включать слишком много библиотек, или компилятор решает, какие из них нужны, а остальные игнорирует?

Спасибо

Ответы [ 2 ]

2 голосов
/ 16 мая 2010

Если есть недостаток в том, чтобы включать слишком много библиотек?

Вряд ли.

Если компилятор определяет, какие из них нужны, а остальные игнорирует?

Почти совершенно верно: это компоновщик , который проверяет каждую библиотеку и извлекает только необходимый ей объектный код.

Недостатком включения очень большого количества библиотек является то, что может быть трудно получить их в правильном порядке. В последних версиях компоновщика GNU есть несколько специальных опций, которые могут помочь с проблемой нестандартных библиотек (и это тоже время), но такие опции остаются непереносимыми. С другой стороны, если вы включите библиотеки, которые на самом деле не нужны, не имеет значения, в каком порядке они появляются, потому что компоновщик тщательно изучит каждую из них и решит, что ни одно из ее содержимого не нужно.

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

1 голос
/ 16 мая 2010

Компоновщик (инструмент, который берет все файлы .o, созданные при компиляции исходного кода и превращает их в исполняемый файл), не будет связывать код, который не был вызван в исполняемый файл. То есть просто сказано:

void foo()
{
 // code
}

void bar()
{
 // code
}

int main()
{
    foo();
    return 0;
}

Здесь код foo будет связан с исполняемым файлом, а код bar - нет. Если предположить, что это целая программа, конечно.

Чтобы получить более полное объяснение, прочитайте ответ , который я дал всего час назад на другой вопрос.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...