Ubuntu, gcc, сборка so, не работают try..catch

159
29 августа 2018, 12:40

Собираю библиотеку Lib.so (Ubuntu, gcc 5.4.0), с помощью CMake на Ubuntu. Параметры сборки такие:

cmake_minimum_required(VERSION 3.2)
set(ProjectName "TestMain")
project(${ProjectName})
SET(CMAKE_CXX_COMPILER "/usr/bin/gcc")
set(CMAKE_CXX_FLAGS ${CMAKE_CXX_FLAGS} "-m64 -std=c++11")
SET(CMAKE_BUILD_TYPE RelWithDebInfo)
set(SOURCE_FILES
    Main.h
    Main.cpp
) 
set_source_files_properties(${SOURCE_FILES} 
                              PROPERTIES COMPILE_FLAGS
                              "-finput-charset=UTF-8 -fPIC")
add_library(${ProjectName} SHARED ${SOURCE_FILES})
set_target_properties( ${ProjectName} PROPERTIES  CLEAN_DIRECT_OUTPUT 1  OUTPUT_NAME ${ProjectName} ) 
target_link_libraries (${ProjectName} "${REQUIRED_LIBRARIES}")

Сборка проходит без ошибок. В одном из методов есть конструкция:

try{
...
throw "Error";
...
}
catch (...)
{
...<обработка исключения>
}

Если вызвать этот метод, когда срабатывает исключение, вместо того, чтобы попасть в catch, вызывается terminate(), и никакой обработки исключений не возникает, работа вызванного метода завершается, не в зависимости от того, где возник throw.

Вызывается библиотека из 1С (сервер на CentOS), с помощью "ПодключитьВнешнююКомпоненту", все вызовы работают корректно, за исключением этой обработки исключений, собранная под Win dll обрабатывает исключения корректно.

Если сделать код из библиотеки, в консольном приложении, обработка исключений проходит корректно. Я так полагаю, что это связано именно с shared library, и, видимо, с некорректными флагами сборки.

Гуглил, наткнулся решение добавить флагов -static-libstdc++ или -static-libgcc, но их добавление ничего не меняет, либо я не правильно их добавлял, любое исключение в библиотеке срабатывает как terminate().

Подскажите, в какую сторону посмотреть и/или что можно попробовать сделать, чтобы исключения в .so работали корректно.

Answer 1

У нас была похожая проблема, когда собирался код с одной библиотекой libstdc++ (ну или как там называется стандартная библиотека с++), а выполнялся код с другой библиотекой (в смысле с другой версией). Исключения не ловились.

Проверьте версии libgcc - с какой собирается, с какой запускается.

READ ALSO
Арканоид на c++

Арканоид на c++

Задали написать арканоидВозникла проблема с моментом физики поведения мяча, мяч и дощечка ( от которой он отскакивает ) представляют собой...

563
Поиск файла в папке ресурсов

Поиск файла в папке ресурсов

Есть проект с архитектурой:

160
Объект canvas не прорисовывается при касании

Объект canvas не прорисовывается при касании

Не получается сделать так, чтобы при касании на экран появляется объект canvas цифра 8 в точке нажатияПомогите исправить ошибку

206