Сколько раз пользовался 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
ПОЧЕМУ?! Путь к статической библиотеке в проекте прописан. |