Транзитивные зависимости для статических библиотек и SCons - PullRequest
5 голосов
/ 03 февраля 2011

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

Проблема: У меня есть две статические библиотеки, libA и libB, и libB зависит от libA.Я не хочу явно связывать все программы, которые используют libB, с libA, я хочу, чтобы SCons видел, что если программа ссылается на библиотеку B, она также должна ссылаться на библиотеку A.

Я построил простоепример, который иллюстрирует эту проблему.Так как я не смог найти подходящего хостера файлов и это связано с программированием, я создал небольшой репозиторий SVN:

svn checkout https://example-repository.googlecode.com/svn/trunk example-repository

или вы можете скачать архив здесь .

Ответы [ 2 ]

4 голосов
/ 11 февраля 2011

SCons не имеет встроенной поддержки для выражения зависимостей переходных библиотек, как вы описываете, но его младший двоюродный брат Waf делает. См. документацию для функции "использования" в книге Waf. Boost build system также имеет эту функцию под другим именем . Вы также можете реализовать это самостоятельно в SCons, если хотите немного написать на Python.

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

0 голосов
/ 03 февраля 2011

Что такое libB и libA? Являются ли они библиотеками, которые представляют собой один большой файл .o или состоят из нескольких файлов .o?

Если библиотеки - это несколько файлов .o, и вы вызываете функцию в одном из файлов .o библиотеки libB, который использует один из файлов .o библиотеки libA, то вы получите файл .o библиотеки libB и зависимую библиотеку libA .o. Если вы используете в libB .o функцию, которая ни от чего не зависит от libA, тогда вы получите только файл libB .o в вашем двоичном файле.

Таким образом, если у вас есть команда:

cc -o a.out a.c libA.a libB.a

Вы получите только необходимые части как от libB, так и от libA.

...