У меня следующая проблема. Я пишу общую библиотеку
#include <stdio.h>
#include <stdlib.h>
static void __attribute__ ((constructor)) test_init(void);
static void __attribute__ ((destructor)) test_clean(void);
/* Initialization */
static void test_init(void){
fprintf(stderr,"initialized\n");
fflush(stderr);
}
/* CleanUp */
static void test_clean(void){
fprintf(stderr,"cleaned up\n");
fflush(stderr);
}
double test (double x){
return 2.0*x;
}
и компилирую ее, используя
gcc -c -fPIC testlib.c -o testlib.o
ld - shared -o libtest.so testlib.o
Затем я включаю его в тестовую программу
#include <stdio.h>
#include <stdlib.h>
extern double test(double x);
void main(void){
printf("%.10e\n",test(10.0));
}
, которую компилирую и начинаю использовать
gcc testprog.c -o testprog -L. -ltest
LD_LIBRARY_PATH =. ./testprog
Затем вывод будет иметь вид
2.0000000000e + 01
, что означает, что конструктор / деструктор не выполняется. С другой стороны, если я компилирую
ar rvs testlib.a testlib .o
gcc testprog.c testlib.a -o testprog
вывод программы задается
testprog инициализирован 2.0000000000e + 01 очищено
Почему конструкторы не выполняются, если библиотека связана динамически?
Я использую следующие версии
GNU ld (GNU Binutils; openSUSE 11.3) 2.20.0.20100122-6 gcc версия 4.5.0 20100604 [gcc-4_5-ветка версия 160292] (SUSE Linux)
Заранее благодарю вас за вашу помощь!
Отредактировано: 2011-04-13, 11:05
Большое спасибо много luxifer,
документ помог косвенно! Волшебный намек заключался в том, что компоновщик следует задействовать через компилятор ...
gcc -fPIC testlib.c -shared -Wl, -soname, libtest.so -o libtest.so
работает !!!