Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Fortran > [Interop] iso_c_binding, IFC и VS


Автор: popovda 26.3.2009, 19:20
Сколько раз пользовался iso_c_binding, но понять, что же случилось в этот раз - не пойму. Туплю.

Итак, для простоты (тупо просто работающая функция, важно, что парамерты совпадают с реальной), есть C-функция, помещенная в статическую библиотеку:
Код

#include <iostream>

using namespace std;

int C_test_func(int M, int N, double *Z){
    
        cout<<"Rows = "<<M<<"; "<<"Cols = "<<N<<endl;
        cout<<"Array data:"<<endl;
        for (int i = 0; i<M; i++){
            for (int j = 0; j<N; j++){
                cout<<Z[i*M + j]<<'   ';    
            }//for j...
            cout<<endl;
        }//for i...

return M*N;
}



и есть вызывающая её Фортран-программа:

Код

program TestCBinding

use, intrinsic :: iso_C_binding;

implicit none;

interface C_Func
    ! Интерфейс к C-функции
    ! int C_test_func(int M, int N, double *Z)
    integer(C_INT) function C_Func(M,N,Z) bind(C,NAME = 'C_test_func')
        use , intrinsic :: iso_C_binding;    
        implicit none;
        
        ! Параметры
        integer(C_INT), value, intent(in) :: M;
        integer(C_INT), value, intent(in) :: N;
        real(C_DOUBLE), dimension(:,:), intent(in) :: Z;
    end function C_Func;
end interface C_Func;

integer(4) :: M,N,i,j;
real(8), allocatable, dimension(:,:) :: A;

integer(C_INT) :: cM, cN, res;
real(C_DOUBLE), pointer, dimension(:,:) :: Z;

M = 5;
N = 10;


allocate(A(M,N));
print *,'Das Fortran:'
do i = 1,M
    do j = 1,N
    
        A(i,j) = sin(dble(3.1415*i)) + cos(dble(-6.2830*j));
        print *,'A(',i,';',j,') = ',A(i,j);
    end do;
end do;

read(*,*)

print*
print*
print*
print*, 'Das C:' 

res = C_Func(M,N,RESHAPE(A, (/N,M/), ORDER = (/ 2, 1/)));

deallocate(A);

print *,'Result = ', res;

end program TestCBinding



Ошибка линковки:
Error    2     error LNK2019: unresolved external symbol _C_test_func referenced in function _MAIN__    F_Code.obj    

ПОЧЕМУ?! Путь к статической библиотеке в проекте прописан.

Автор: adejneka 26.3.2009, 20:37
C_test_func больше похожа на C++-функцию, чем на C. Может, обрамить её extern "C" {...}?

Автор: popovda 26.3.2009, 22:08
Гм...А ведь логично. 

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)