Представьте, что у вас есть проект, который состоит из следующих трех файлов C в одной папке:
// ---- jam.h
int jam_badger(int);
// ---- jam.c
#include "jam.h"
int jam_badger(int a)
{
return a + 1;
}
// ---- main.c
#include "jam.h"
int main()
{
return jam_badger(2);
}
И вы создаете его с помощью файла bjam boost-build, как этот;
lib jam : jam.c <link>static ;
lib jam_badger : jam ;
exe demo : jam_badger main.c ;
Вы получите такую ошибку.
undefined reference to `jam_badger'
(я использовал bjam здесь, потому что файл легче читать, но вы можете использовать все, что захотите)
Удаление «статического» приводит к созданию работающего двоичного файла, равно как и добавление статического в другую библиотеку, или просто использование одной библиотеки (а не глупое завершение внутри другой)
Причина, по которой это происходит, в том, что ld достаточно умен, чтобы выбирать только те части архива, которые фактически используются, что в данном случае не является ни одной из них.
Решение состоит в том, чтобы окружить статические архивы с помощью -Wl, - whole-archive и -Wl, - no-whole-archive, вот так;
g++ -o "libjam_candle_badger.so" -Wl,--whole-archive libjam_badger.a Wl,--no-whole-archive
Не совсем уверен, как получить boost-build, чтобы сделать это для вас, но вы поняли идею.