2013-07-24 34 views
5

Tôi đang cố gắng để biên dịch và liên kết mã Fortran gọi c chương trình con:Gọi C chức năng/chương trình con trong mã Fortran

mã Fortran:

program adder 
integer a,b 
a=1 
b=2 
call addnums(a,b) 
stop  
end program 

C mã:

void addnums(int* a, int* b) 
{ 
    int c = (*a) + (*b); /* convert pointers to values, then add them */ 
    printf("sum of %i and %i is %i\n", (*a), (*b), c); 
} 

tôi sử dụng các lệnh sau đây để biên dịch và liên kết trong môi trường windows.

ifort -c adder.f 
cl -c addnums.c 
ifort -o add adder.obj addnums.obj 

tôi nhận được lỗi sau:

Microsoft (R) Incremental Linker Version 8.00.50727.762 
Copyright (C) Microsoft Corporation. All rights reserved. 
-out:add.exe 
-subsystem:console 
adder.obj 
addnums.obj 
adder.obj : error LNK2019: unresolved external symbol ADDNUMS referenced in function MAIN__ 
add.exe : fatal error LNK1120: 1 unresolved externals 

Xin hãy giúp tôi giải quyết vấn đề này? Cảm ơn.

+0

Bạn đã thử khớp tên chức năng đó (nghĩa là tất cả mũ)? –

Trả lời

10

Bạn cần cung cấp thân giao diện cho hàm C bên trong phần đặc tả của chương trình chính Fortran cho trình biên dịch Fortran biết tên addnums là hàm C. Một cái gì đó như:

INTERFACE 
    SUBROUTINE addnums(a, b) BIND(C) 
    USE, INTRINSIC :: ISO_C_BINDING, ONLY: C_INT 
    IMPLICIT NONE 
    INTEGER(C_INT) :: a, b 
    END SUBROUTINE addnums 
END INTERFACE 

(Với những trình biên dịch trên nền tảng đó mà không cần tùy chọn đặc biệt các loại mặc định của số nguyên cũng giống như C_INT - nhưng là rõ ràng về các loại nguyên giúp bảo vệ bạn nếu trình biên dịch/nền tảng hoặc biên dịch tùy chọn thay đổi.)

+0

Cảm ơn. Đề nghị của bạn đã giúp. – momba

2

Dưới đây là hai điều tôi có thể thấy ngay lập tức (tôi làm việc chủ yếu với FORTRAN77 vì vậy đây có thể không phải là cách mới nhất hoặc tốt nhất để làm điều này):

  1. Kể từ khi chức năng C của bạn, cũng , một hàm (và không phải là chương trình con), bạn sẽ cần khai báo 'addnums' là EXTERNAL. Thêm mã này vào mã của bạn trong phần khai báo của bạn.

    EXTERNAL addnums
  2. Thêm dấu gạch dưới vào tên hàm trong mã C của bạn. FORTRAN thực hiện điều này tự động với các chức năng riêng của nó, nhưng không hoạt động với các ngôn ngữ khác. Vì vậy, chữ ký của chức năng sẽ

    void addnums_(int* a, int* b)

This page có một tóm tắt khá tốt trên trộn C và FORTRAN. Hy vọng điều này đã giúp!

+1

Cách hiện đại để kết nối Fortran và C là sử dụng ISO_C_Binding của Fortran. Là một phần của ngôn ngữ Fortran, nó là trình biên dịch và nền tảng độc lập. Nó tránh cần phải biết về trình biên dịch internals. Trang được liên kết đã lỗi thời. –

+0

Nếu bạn không thể sử dụng ràng buộc ISO_C, hãy khai báo thường trình C dưới dạng __stdcall nếu không nó sẽ mặc định là __cdecl. Nó sẽ gọi thói quen của bạn và sụp đổ khi thoát. – cup

+0

Liên kết tới "Trang này" bị hỏng. – Wauzl

Các vấn đề liên quan