Использование Fortran для вызова функций C ++ - PullRequest
4 голосов
/ 22 марта 2010

Я пытаюсь получить некоторый код на Фортране для вызова пары написанных мною функций на С ++ (одна из них - c_tabs_).Связывание и все работает просто отлично, пока я вызываю функции, которые не принадлежат классу.

Моя проблема в том, что функции, которые я хочу, чтобы код FORTRAN вызывал, принадлежали классу.Я посмотрел на таблицу символов, используя nm, и имя функции выглядит примерно так:

00000000 T _ZN9Interface7c_tabs_Ev

FORTRAN не позволяет мне вызывать функцию с таким именем из-за подчеркивания в начале, поэтомуЯ в недоумении.

Символ c_tabs, когда его нет в классе, довольно прост, и у FORTRAN с ним нет проблем:

00000030 T c_tabs_

Есть предложения?Заранее спасибо.

Ответы [ 4 ]

7 голосов
/ 22 марта 2010

Имя было искажено, что делает компилятор C ++ с функциями, чтобы разрешить такие вещи, как перегрузка функций и безопасное соединение типов. Честно говоря, вы крайне маловероятно, что сможете вызывать функции-члены из FORTRAN (поскольку FORTRAN не может создавать экземпляры класса C ++, среди прочих причин) - вы должны выражать свой интерфейс в терминах C API, который будет вызываться практически из любого места.

4 голосов
/ 22 марта 2010

Вам нужно будет создать интерфейс в стиле c и «его». C ++ искажает имена методов (и перегруженные функции) для линковки. Общеизвестно, что связывать C ++ с чем-либо, кроме C ++, сложно. Есть «способы», но я настоятельно рекомендую вам просто экспортировать интерфейс C и использовать стандартные средства, доступные в Fortran.

3 голосов
/ 23 марта 2010

Если вы заставите подпрограмму C ++ иметь интерфейс в стиле C (как уже было описано), вы можете использовать функцию привязки ISO C в Fortran 2003 для ее вызова. С помощью привязки ISO C вы можете указать имя подпрограммы и (в определенных пределах) C-типы и соглашения о вызовах (ссылка, по значению) аргументов и возвращаемых функций. Этот метод хорошо работает и имеет преимущество в том, что он является стандартным и, следовательно, зависит от компилятора и платформы, в отличие от старых методов вызова C из Fortran. Привязка ISO C поддерживается многими компиляторами Fortran 95, такими как gfortran> = 4.3.

3 голосов
/ 22 марта 2010

Вам нужно создать extern "C" оболочки, чтобы обрабатывать все детали FORTRAN, вызывающего C ++, наиболее очевидным является искажение имени.

class foo {
public:
    int a_method (int x);
}

extern "C" int foo_a (foo * pfoo, int * px) {
    if (NULL == pfoo)
        return 0;
    else
        return pfoo->a_method (*px);
}

Обратите внимание, что компиляторы FORTRAN передают все аргументы по ссылке, а не по значению. (Хотя мне сказали, что это не является строго говоря частью стандарта FORTRAN.)

...