в качестве темы исследования я использую программу на C ++ для перевода запроса SQL в программу на C ++. После перевода исходный код запроса c ++ компилируется в общую библиотеку:
g++ -O0 -g3 -fPIC -std=c++0x GeneratedQuery.cpp ../type/Types.cpp -shared -o lib.so
Все отлично работает и библиотека скомпилирована правильно. Во второй программе я пытаюсь реализовать цикл read-eval-print-loop, который принимает запрос от пользователя, переводит и компилирует его, загружает общую библиотеку с помощью dlopen и dlsym и, наконец, выполняет ее. До того, как я использовал Intel TBB в коде запроса, все работало нормально, но теперь я получаю ошибку сегментации для второго введенного мной запроса (первый запрос работает отлично, но второй запрос, загруженный в цикл, не выполняется).
Источник (read-eval-print-loop): http://pastebin.com/pWkRN7Dx
Пример кода запроса: http://pastebin.com/A1pBZC3d
Если в моем запросе нет объединения, и, следовательно, в исходном коде запроса возникает единственная параллель_ для, проблем не возникает. Но если есть несколько параллельных_форов, я получаю ошибку сегментации для второго запроса, который я ввожу (компиляция успешна, и dlopen работает, но dlsym терпит неудачу).
Вот вывод GDB
0x00007ffff7de394b in ?? () from /lib64/ld-linux-x86-64.so.2
0x00007ffff7de429e in ?? () from /lib64/ld-linux-x86-64.so.2
0x00007ffff7de4523 in ?? () from /lib64/ld-linux-x86-64.so.2
0x00007ffff6cc612a in ?? () from /lib/x86_64-linux-gnu/libc.so.6
0x00007ffff7bd7044 in ?? () from /lib/x86_64-linux-gnu/libdl.so.2
0x00007ffff7de9176 in ?? () from /lib64/ld-linux-x86-64.so.2
0x00007ffff7bd752f in ?? () from /lib/x86_64-linux-gnu/libdl.so.2
0x00007ffff7bd709a in dlsym () from /lib/x86_64-linux-gnu/libdl.so.2
0x000000000041fd58 in main (argc=1, argv=0x7fffffffe1d8) at ../src/tpcc.cpp:141
Я действительно не понимаю, что не получается для второго запроса. Я пробовал разные флаги для dlopen, но он не работал ни для какой комбинации.
Надеюсь, что кто-то может мне помочь, так как я очень неопытен в общих библиотеках.
С уважением
Попробуй заменить
extern "C" { void run { ... } }
в
extern "C" void run { ... }
Смотрите объяснение в великом http://www.isotton.com/devel/docs/C++-dlopen-mini-HOWTO/C++-dlopen-mini-HOWTO.html бумага.
Я не совсем уверен, что то, что я говорю, правильно или нет, но я помню, что в прошлом году у меня была проблема с аналогами, и я решил ее, создав .so с включенными библиотеками. Что-то вроде этого:
g ++ -O0 -g3 -fPIC -std = c ++ 0x GeneratedQuery.cpp ../type/Types.cpp {добавить сюда информацию по Intel .a и т. д.} -shared -o lib.so
Я использовал CMAKE, и мне пришлось добавить в add_library вещи.
Я надеюсь, что это поможет, если не извинения!
Работает, но я все еще в замешательстве:
Если я даю каждому файлу библиотеки другое имя, например lib..so, и загружаю его, все работает нормально. Есть ли что-то вроде кэша, который может привести к описанному выше поведению?