sorry, my fault... `man libtool` если быть более точным...
читаем в разделе про `link mode'
`-export-symbols SYMFILE'
Tells the linker to export only the symbols listed in SYMFILE.
The symbol file should end in `.sym' and must contain the name of
one symbol per line. This option has no effect on some platforms.
By default all symbols are exported.
`-export-symbols-regex REGEX'
Same as `-export-symbols', except that only symbols matching the
regular expression REGEX are exported. By default all symbols are
exported.
тестик:
#include <iostream>
using namespace std;
int foo()
{
cout << __PRETTY_FUNCTION__ << endl;
return 0;
}
int bar()
{
cout << __PRETTY_FUNCTION__ << endl;
return 0;
}
int foo_bar()
{
cout << __PRETTY_FUNCTION__ << endl;
return 0;
}
А можно ли при линковке .so библиотек использовать файлики аля виндовые .DEF файлы?
Мне просто нравится сам подход, что под виндой из ДЛЛки торчит 1-2 функции.... хотелось бы тоже самое под линухом... мне в принципе не жалко, что торчит вся ДЛЛка, но коль скоро проект кроссплатформенный, хотелось бы максимальной похожести...
поиск ничего не дал, кроме фраз типа "задолбали нубы, не читают маны" и самих манов... Кстати по ним видно, что теоретически ld поддерживает .DEF файлы, только под линухом эта функциональность видимо отключена...
В общем у кого какая инфа есть по этому поводу?
ЗЫ есть еще __attribute__ ((visibility("hidden"))) — но это на уровне компилера... а мне нужно эту инфу линкеру скармливать
Здравствуйте, Graf Alex, Вы писали:
GA>А можно ли при линковке .so библиотек использовать файлики аля виндовые .DEF файлы?
GA>Мне просто нравится сам подход, что под виндой из ДЛЛки торчит 1-2 функции.... хотелось бы тоже самое под линухом... мне в принципе не жалко, что торчит вся ДЛЛка, но коль скоро проект кроссплатформенный, хотелось бы максимальной похожести...
GA>поиск ничего не дал, кроме фраз типа "задолбали нубы, не читают маны" и самих манов... Кстати по ним видно, что теоретически ld поддерживает .DEF файлы, только под линухом эта функциональность видимо отключена...
GA>В общем у кого какая инфа есть по этому поводу?
GA>ЗЫ есть еще __attribute__ ((visibility("hidden"))) — но это на уровне компилера... а мне нужно эту инфу линкеру скармливать
Здравствуйте, McQwerty, Вы писали:
MQ>Здравствуйте, Graf Alex, Вы писали:
GA>>А можно ли при линковке .so библиотек использовать файлики аля виндовые .DEF файлы?
GA>>Мне просто нравится сам подход, что под виндой из ДЛЛки торчит 1-2 функции.... хотелось бы тоже самое под линухом... мне в принципе не жалко, что торчит вся ДЛЛка, но коль скоро проект кроссплатформенный, хотелось бы максимальной похожести...
GA>>поиск ничего не дал, кроме фраз типа "задолбали нубы, не читают маны" и самих манов... Кстати по ним видно, что теоретически ld поддерживает .DEF файлы, только под линухом эта функциональность видимо отключена...
GA>>В общем у кого какая инфа есть по этому поводу?
GA>>ЗЫ есть еще __attribute__ ((visibility("hidden"))) — но это на уровне компилера... а мне нужно эту инфу линкеру скармливать
MQ>Вот zaufi в своё время говорил здесь
MQ>Я думаю он расскажет как это делать.
1) ссылка некорректна. Хотя бы потому, что я почти полностью разделяю взгляды г-на zaufi. К тому же это очередные священные войны — не хочу спорить. И вообще по теме кроме вышеуказаной фразы ничего больше нет.
2) ман линкера я перепахал нескольок раз в разных направлениях и разных версиях. Как я уже писал он умеет работать с .DEF файлами, но судя по всему не в линуксовой версии
3) именно это я и имел в виду под фразой "задолбали нубы". Вместо того, что бы дать хотя бы напрявляющий ответ — тупо отсылают к манам. Видимо кнопки давить облом.
4) посольку многие понятия на винде и на линухе по разному называются, просто мог не найти нужного в мане... Для того я и обратился сюда. Но вместо того, что бы ответ получить — получил посылание в... маны...
Здравствуйте, Graf Alex, Вы писали:
GA>>>А можно ли при линковке .so библиотек использовать файлики аля виндовые .DEF файлы?
MQ>>Вот zaufi в своё время говорил здесь
GA>1) ссылка некорректна. Хотя бы потому, что я почти полностью разделяю взгляды г-на zaufi. К тому же это очередные священные войны — не хочу спорить. И вообще по теме кроме вышеуказаной фразы ничего больше нет.
Взгляд zaufi, который ты разделяешь, на эту проблему простой — банально читать ман. Поэтому не удивляйся, что получил GA>4) посылание в... маны...
По теме: не экпортировать что-либо без сообщения этого компилятору нельзя. А в компиляторе — сильно уникальными средставами (читай — непереносимо). Есть также ключ --version-script, но мне не удалось заставить его работать (gcc 3.4.6) так как нужно.
Здравствуйте, McQwerty, Вы писали:
MQ>По теме: не экпортировать что-либо без сообщения этого компилятору нельзя. А в компиляторе — сильно уникальными средставами (читай — непереносимо).
То есть? Вполне переносимо:
#ifdef _MSC_VER
#ifdef BUILDING_DLL
#define DLLEXPORT __declspec(dllexport)
#else
#define DLLEXPORT __declspec(dllimport)
#endif
#define DLLLOCAL
#else
#ifdef HAVE_GCCVISIBILITYPATCH
#define DLLEXPORT __attribute__ ((visibility("default")))
#define DLLLOCAL __attribute__ ((visibility("hidden")))
#else
#define DLLEXPORT
#define DLLLOCAL
#endif
#endif
extern"C" DLLEXPORT void function(int a);
class DLLEXPORT SomeClass
{
int c;
DLLLOCAL void privateMethod(); // Only for use within this DSOpublic:
Person(int _c) : c(_c) { }
static void foo(int a);
};
Здравствуйте, Cyberax, Вы писали:
C>Здравствуйте, McQwerty, Вы писали:
MQ>>По теме: не экпортировать что-либо без сообщения этого компилятору нельзя. А в компиляторе — сильно уникальными средставами (читай — непереносимо). C>То есть? Вполне переносимо: C>
C> #ifdef HAVE_GCCVISIBILITYPATCH
C>
Угу, и проблема спускается на уровень makefile: -DHAVE_GCCVISIBILITYPATCH
И иметь несколько makefile-ов по числу target-платформ.
Здравствуйте, McQwerty, Вы писали:
MQ>Угу, и проблема спускается на уровень makefile: -DHAVE_GCCVISIBILITYPATCH MQ>И иметь несколько makefile-ов по числу target-платформ.
Если ты используешь Autoconf — то можно просто написать тест для него. А если не используешь — все равно надо будет несколько make-файлов.
Здравствуйте, McQwerty, Вы писали:
MQ>Здравствуйте, Cyberax, Вы писали:
C>>Здравствуйте, McQwerty, Вы писали:
MQ>>>По теме: не экпортировать что-либо без сообщения этого компилятору нельзя. А в компиляторе — сильно уникальными средставами (читай — непереносимо). C>>То есть? Вполне переносимо: C>>
C>> #ifdef HAVE_GCCVISIBILITYPATCH
C>>
MQ>Угу, и проблема спускается на уровень makefile: -DHAVE_GCCVISIBILITYPATCH MQ>И иметь несколько makefile-ов по числу target-платформ.
С этим проблем не будет — таргет платформ всего 2: винда и линух. В винде проекты вижуал студии, в линухе мейкфайлы.
К тому же, как я уже писал, если все функции из so-шки будут экспортироваться, то ничего страшного не произойдет. Просто хотелось подобия.
В коде пока нигде нет модификаторов export/import и вводить их мне облом (так недолго и весь проект поламать). Все регулируется .DEF файлами.
ЗЫ Визибилити это, конечно, хорошо... Я бы не спрашивал, если бы хотел так сделать... Просто интересно проблему решить линкером...
Z>sorry, my fault... `man libtool` если быть более точным... Z>читаем в разделе про `link mode'
оно... спасибо!!
правда либтулом не пользуюсь... но зато подсмотрел как он это делает
Ключик -retain-symbols-file линкеру отлично хавает DEF файлы
во всяком случае наши...
ЗЫ до тех пор, пока какой то умник не назовет свою функцию EXPORTS или LIBRARY