--------------------Configuration: 10 - Win32 Debug-------------------- Compiling Fortran... D:\HJWFORTRAN\KESHE\09\9.f90 Linking... 9.obj : error LNK2005: _MAIN__ already defined in 010.obj Debug/10.exe : fatal error LNK1169: one or more multiply defined symbols found Error executing link.exe. 10.exe - 2 error(s), 0 warning(s) 据此改错
时间: 2025-06-23 07:53:31 浏览: 15
根据您提供的错误信息,问题出在Fortran程序中存在多个`MAIN__`入口点的定义。通常情况下,一个Fortran程序只能有一个主程序块(即`program`块),如果链接了多个对象文件(如`9.obj`和`010.obj`),并且每个对象文件中都包含了一个`program`块,则会导致重复定义`MAIN__`符号的错误。
以下是解决此问题的方法:
---
### **解决方案**
#### 1. 确保只有一个主程序块
检查您的项目文件,确保只有**一个**文件包含`program`块。其他文件应仅包含子程序或函数(通过`module`或`contains`关键字定义)。
例如,假设您有两个文件:
- 文件`9.f90`包含一个`program`块。
- 文件`010.f90`也包含一个`program`块。
这种情况下,编译器会报错,因为链接时发现两个`MAIN__`入口点。
解决方法是将其中一个文件中的`program`块移除,或者将其内容改为子程序或函数。
---
#### 2. 使用模块化编程
将所有子程序或函数定义为模块(`module`),并在主程序中使用`use`语句调用这些模块。这样可以避免重复定义`MAIN__`的问题。
以下是一个示例代码结构:
```fortran
! 文件: subroutines.f90
module my_subroutines
implicit none
contains
! 定义子程序
subroutine print_hello()
print *, "Hello, World!"
end subroutine print_hello
! 定义另一个子程序
subroutine add_numbers(a, b, result)
real, intent(in) :: a, b
real, intent(out) :: result
result = a + b
end subroutine add_numbers
end module my_subroutines
```
```fortran
! 文件: main_program.f90
program main
use my_subroutines ! 引入模块
implicit none
real :: x, y, z
call print_hello() ! 调用模块中的子程序
x = 5.0
y = 3.0
call add_numbers(x, y, z) ! 调用模块中的另一个子程序
print *, "The sum is:", z
end program main
```
---
#### 3. 编译和链接
确保正确编译和链接所有文件。例如,使用以下命令编译上述两个文件:
```bash
gfortran -c subroutines.f90 # 编译模块文件为对象文件
gfortran -c main_program.f90 # 编译主程序文件为对象文件
gfortran subroutines.o main_program.o -o program.exe # 链接生成可执行文件
```
---
### **解释**
1. **错误原因**:
- 每个Fortran程序只能有一个`MAIN__`入口点。
- 如果多个源文件中都包含`program`块,则在链接阶段会出现重复定义`MAIN__`的错误。
2. **解决方法**:
- 确保只有**一个**文件包含`program`块。
- 将其他文件中的功能封装为模块或子程序,并通过`use`语句在主程序中调用。
3. **模块化编程的优点**:
- 提高代码复用性。
- 减少重复代码。
- 更易于维护和扩展。
---
###
阅读全文
相关推荐


















