?
#include <iostream>
extern "C" void _init(){
std::cout << "init called" << std::endl;
}
>g++ -shared -o libtest.so -fPIC main.cpp
говорит про переопределение _init()
но ведь мне нужен _init, чтобы его вызвал dlopen() (в целом там предусмотрена некоторая инициализация)
Как быть?
Это весь код?
main.cpp:(.text+0x0): повторне визначення «_init»; /usr/lib/gcc/x86_64-pc-linux-gnu/13.2.1/../../../../lib/crti.o:(.init+0x0): тут визначено вперше
В crt определена такая же функция.
Значит так, как ты сделал, делать нельзя и нужно внимательно читать, как подобную либы делать с такой функцией. При этих ключах сьорки твоя функция уже определена в crti.
Как вариант, если так сильно нужно именно _init создать, можно функцию объявить как void _init() asm("_init"); void _init() { ... } И скомпилировать без стандартной библиотеки. Но это очень сильно усложнит тебе жизнь.
>__attribute__((constructor)) #include <iostream> extern "C" void _init() __attribute__((constructor)); extern "C" void _init(){ std::cout << "init called" << std::endl; } это не решает проблему. Всё таже ошибка - multiple definition of `_init'; /usr/lib/gcc/x86_64-pc-linux-gnu/13.2.1/../../../../lib/crti.o:(.init+0x0): first defined here >По соглашению вызовов Си, функция init в 32 битной программе станет _init. я компилю в x64. Если я переименовываю функцию в init (оно компилится тогда), всё равно есть экспорт функции _init. И я так понимаю она и вызовется dlopen. Я немного перефразирую вопрос. Как мне выполнить код при загрузке библиотеки? Желательно без отключения CRT
Ну так функцию переименуй теперь
При загрузке динамической библиотеки - средствами ОС, при загрузке статических Библ. -никак
Обсуждают сегодня