LINUX.ORG.RU

История изменений

Исправление vodz, (текущая версия) :

Именно так.

Не хотелось расписывать, но таки придётся. Если библиотека содержит несколько объектников, то символы будут последовательно выбраны и прилинкованы одним проходом просмотра библиотек. Но если символы в одном из объектников в каждой библиотеке, то все требуемые объектники будут заюзаны, а символы будут рекурсивно слинкованы, что ТСу и надо.

$ cat m.c
double my_cos1(double x);
double my_sin1(double x);

int main(void)
{
    double r = my_cos1(0) + my_sin1(0);
    return r != 0;
}

$ cat f1.c
#include <math.h>

double my_cos(double x)
{
    return cos(x);
}

double my_sin(double x);

double my_sin1(double x)
{
    return my_sin(x);
}

$ cat f2.c
#include <math.h>

double my_cos(double x);

double my_cos1(double x)
{
    return my_cos(x);
}

double my_sin(double x)
{
    return sin(x);
}
Как видите, в примере один объектник имеет my_X и my_Y1, а другой my_X1 и my_Y. Результат соберется в любой последовательности:
$ cc -c f1.c f2.c; ar rc l1.a f1.o; ar rc l2.a f2.o; ranlib f1.a; ranlib f2.a
$ cc m.c l1.a l2.a -lm # или
$ cc m.c l2.a l1.a -lm 
# причём -lm - в любом положении

Исходная версия vodz, :

Именно так.

Не хотелось расписывать, но таки придётся. Если библиотека содержит несколько объектников, то символы будут последовательно выбраны и прилинкованы одним проходом просмотра библиотек. Но если символы в одном из объектников в каждой библиотеке, то все требуемые объектники будут заюзаны, а символы будут рекурсивно слинкованы, что ТСу и надо.

$ cat m.c
double my_cos1(double x);
double my_sin1(double x);

int main(void)
{
    double r = my_cos1(0) + my_sin1(0);
    return r != 0;
}

$ cat f1.c
#include <math.h>

double my_cos(double x)
{
    return cos(x);
}

double my_sin(double x);

double my_sin1(double x)
{
    return my_sin(x);
}

$ cat f2.c
#include <math.h>

double my_cos(double x);

double my_cos1(double x)
{
    return my_cos(x);
}

double my_sin(double x)
{
    return sin(x);
}
Как видите, в примере один объектник имеет my_X и my_Y1, а другой my_X1 и my_Y. Результат соберется в любой последовательности:
$ cc -c f1.c f2.c; ar rc l1.a f1.o; ar rc l2.a f2.o; ranlib f1.a; ranlib f2.a
$ cc m.c f1.a f2.a -lm # или
$ cc m.c f2.a f1.a -lm 
# причём -lm - в любом положении