Проблема компиляции C++ в AIX 1.7

У меня есть эта странная проблема при компиляции простой программы на C++, которая выдает исключение.

основной.cc:

#include <stdio.h>
double mean(double a, double b)
{
    if((a + b) == 0)
    {
        throw "Exception:: Numerator is Zero";
    }
    return (a+b) / 2;`
}

расч.cc:

#include <stdio.h>
double mean(double a, double b)
{
    if((a + b) == 0)
    {
        throw "Exception:: Numerator is Zero";
    }
    return (a+b) / 2;
}

Когда я компилирую его, как показано ниже:

Execute the following commands :
Step 2.1 => gcc -maix64 -fpic -c calc.cc
Step 2.2 => gcc -maix64 -shared -o libcalc.so calc.o -lstdc++
Step 2.3 => gcc -maix64 main.cc libcalc.so -lstdc++

И запустите программу, программа вылетает со следующей ошибкой:

terminate called after throwing an instance of 'char const*'
IOT/Abort trap (core dumped)

Но вместо шага 2.3, если мы используем следующие команды, все работает как положено:

gcc -maix64 main.cc libcalc.so -lstdc++ -lgcc_s

Не могли бы вы помочь в решении этого...


person Anand Kumar Keshri    schedule 26.12.2011    source источник
comment
Можешь проверить свой пост? Ваш calc и main одинаковы.   -  person Francis Upton IV    schedule 26.12.2011
comment
Вы имеете в виду AIX 7.1? AIX 1.7, если она когда-либо существовала, устарела на десятилетия.   -  person Jonathan Leffler    schedule 26.12.2011
comment
это 1.7 (извините за опечатку)``   -  person Anand Kumar Keshri    schedule 26.12.2011
comment
Что происходит, когда вы пытаетесь использовать компилятор C++ вместо компилятора C?   -  person Steve C    schedule 26.12.2011


Ответы (1)


Вы дали ответ в вопросе, я думаю. Этот вопрос помог мне решить аналогичную проблему. У нас есть конкретный двоичный файл C, который был связан с общим объектом, скомпилированным с помощью g++ и способным генерировать исключения. Исключения всегда перехватываются в библиотеке. Чтобы связать это в AIX, вы должны указать все зависимые библиотеки в строке ссылки. Поэтому я добавил -lstdc++. Это позволяло компилировать все, но тесты времени выполнения падали, как только в общем объекте возникало исключение. Добавление -lgcc_s исправило это, потому что в gcc_s находится весь код обработки исключений.

Как прокомментировал Steve C, альтернативой является просто скомпилировать файл .c с помощью g++, а затем все это будет обработано. Наша система сборки всегда вызывает gcc для файлов .c, и мне было трудно изменить это, поэтому я просто добавил -lstdc++ и -lgcc_s, и все работает, включая все тесты времени выполнения.

person Skrymsli    schedule 30.04.2012