2014-10-03 1 views
0

Я использовал код FORTRAN, main.f90, для отправки массива func.cpp, который вызывается кодом C++, addition.cpp & дополнение.h. Код работал правильно на платформе CentOS 4, но когда я переместил его на CentOS 6, он дал мне ошибки. Я попытался использовать ту же версию gcc (4.3.0) на обеих машинах или более новую версию 4.4.7 в CentOS 6, но проблема не устранена. Я прилагаю по-упрощенная версия кода, какФайл конфигурации Cmake для вызова кода на C++ из функции C++, вызванной кодом FORTRAN

main.f90:

program main 
    use iso_c_binding 
    implicit none 

    interface 
     function func (a) bind (C, name="func") 
     import 
     integer(c_int):: func 
     real(c_double), dimension(1:4), intent(in):: a 
     end function func 
    end interface 

    real(c_double), dimension(1:4):: a = [ 2.3, 3.4, 4.5, 5.6 ] 
    integer(c_int):: result 
    result = func(a) 
    write (*,*) result 
end program main 

func.cpp:

#include <iostream> 
#include "addition.h" 
using namespace std; 

#ifdef __cplusplus 
    extern"C" { 
#endif 

void *__gxx_personality_v0; 

int func(double a[]) { 
    int i; 
    for(i=0; i<4; i++) { 
     cout << a[i] << endl; 
    } 
    int z; 
    z = addition (5,3); 
    cout << z << endl; 
    return 0; 
} 

#ifdef __cplusplus 
    } 
#endif 

addition.cpp:

#include <iostream> 
#include "addition.h" 
using namespace std; 
int addition (int a, int b) 
{ 
int r; 
r = a + b; 
return r; 
} 

дополнение .h:

#ifndef ADDITION_H 
#define ADDITION_H 
int addition (int a, int b); 
#endif /* ADDITION_H */ 

CMakeLists.txt:

PROJECT(test) 
cmake_minimum_required(VERSION 2.6) 
enable_language(C Fortran) 
# Setting the compilers 
set (CMAKE_Fortran_COMPILER /usr/bin/gfortran) 
set (CMAKE_CXX_COMPILER /usr/bin/g++) 
# Setting the flags 
set (CMAKE_CXX_FLAGS "-lgfortran") 
set_source_files_properties(main.f90 func.cpp PROPERTIES COMPILE_FLAGS -c) 
# Making the executable 
ADD_EXECUTABLE(test.exe main.f90 func.cpp addition.cpp addition.h) 

Ошибка я получаю сейчас:

/usr/lib/gcc/x86_64-redhat-linux/4.4.7/../../../../lib64/crt1.o: In function `_start': 
(.text+0x20): undefined reference to `main' 
collect2: ld returned 1 exit status 
make[2]: *** [test.exe] Error 1 
make[1]: *** [CMakeFiles/test.exe.dir/all] Error 2 
make: *** [all] Error 2 

Я признателен за любую помощь по решению этой проблемы.

+0

Из того, что я вижу на выходе, я могу сказать, что проблема находится в основном файле fortran. Очевидно, fortran-код не генерирует «главную» точку входа. Попробуйте скомпилировать простой код fortran без каких-либо внешних C++-библиотек и посмотреть, работает ли он – user3159253

+0

Также я бы запустил 'make' (на созданный CMake Makefile (s)) как' make VERBOSE = 1', чтобы увидеть точные команды, являющиеся выпущенные make (gcc, ld и т. д.), и сможете воспроизвести проблему самостоятельно, шаг за шагом, без какой-либо «сборки» вообще, только вы, код, компилятор и компоновщик. – user3159253

+0

Когда я запускаю простой код fortran без какого-либо файла cpp, он работает правильно. Я удалил все, что связано с дополнительными.cpp и addition.h, чтобы сделать его проще (так что есть только вызов func.cpp влево); однако, я получаю ту же ошибку. – Vahid

ответ

1

Почему вы связываетесь с g++, когда ваша основная программа находится в Фортране? Сделайте это по-другому, ссылку с gfortran и добавьте -lstdc++.

Просто добавьте строку: SET_TARGET_PROPERTIES(test.exe PROPERTIES LINKER_LANGUAGE Fortran)

Или использовать более свежий GCC. Все версии GCC, которые все еще поддерживаются, работают даже с вашими исходными настройками.