У меня есть некоторый код, структурированный так:
Исправлена основная линия -> код пользователя -> зависимая библиотека
Эти три части могут быть статически связаны, и все в порядке.В качестве альтернативы, основная строка может быть превращена в исполняемый файл, а пользовательский код - в dylib, а основная строка загружает код пользователя с помощью dlopen () и вводит его с помощью dlsym ().
У меня есть сотни тестовых программ, гдеэто работает нормально, но в двух случаях, когда это не удается:
- Случай 1: зависимой библиотекой является gmpxx (зависит от gmp).
- Случай 2: зависимой библиотекой является SDL
В случае gmp динамическая программа печатает правильные ответы, а затем завершается с:
flx_run(29601) malloc: *** error for object 0x7fff712ac500: pointer being freed was not allocated
*** set a breakpoint in malloc_error_break to debug
Abort trap
(gdb) bt
#0 0x00007fff8438e0b6 in __kill ()
#1 0x00007fff8442e9f6 in abort ()
#2 0x00007fff84346195 in free ()
#3 0x00000001000d3a35 in flxusr::gmp__hyphen_0::_init_ ()
Previous frame inner to this frame (gdb could not unwind past this frame)
Я предполагаю, что некоторое повреждение памяти здесь.
ВСлучай SDL:
~/felix>LD_LIBRARY_PATH=build/release/lib/rtl build/release/bin/flx_arun demos/sdl/sdl-1.01.03-0.dylib
frames in seconds = FPS
frames in seconds = FPS
frames in seconds = FPS
, тогда как
~/felix>demos/sdl/sdl-1.01.03-0
98 frames in 5.016 seconds = 19.5375 FPS
100 frames in 5.043 seconds = 19.8295 FPS
82 frames in 5.043 seconds = 16.2602 FPS
Данные о частоте кадров форматируются как
_urv20946 = ::flx::rtl::strutil::str(((double)PTF Frames / seconds ));
, где
template<class T>
string str(T const &t) {
std::ostringstream x;
x << t;
return x.str();
}
с учетом этогоКод находится "в" зависимой библиотеке (ну, конечно, нет, он находится в заголовочном файле!)
Есть идеи?