История изменений
Исправление 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);
}
$ 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);
}
$ 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 - в любом положении