如何使用GCC及ld链接大量.mod、.o文件与静态库?
正确链接Fortran目标文件与静态库的方法
推荐方案:用gfortran代替ld链接(更简单可靠)
直接用gfortran执行链接是最稳妥的选择,它会自动处理Fortran运行时库的依赖,无需手动指定一堆系统库。
操作步骤:
- 修改
names.rsp文件,调整内容顺序(链接器按从左到右的顺序解析符号,被依赖的文件/库必须放在调用它的文件之后):
-o mys.exe \ ALLOCATED_ARRAY_DATA.o \ ALLOCATED_MEMORY.o \ ALLOCATED_MEMORY_Interface.o \ ../superlu/src/c_fortran_dgssv.o \ ../superlu/lib/superlu.a \ ../superlu/lib/libopenblas.a
- 执行链接命令:
gfortran @"names.rsp"
备选方案:手动用ld链接(需处理运行时依赖)
如果必须使用ld,需要手动指定Fortran和C的运行时库,同时严格注意路径与顺序:
操作步骤:
- 先通过以下命令获取你的GCC库路径:
gfortran -print-search-dirs
从输出的libraries:字段中找到对应的路径,比如/path/to/gcc/lib。
- 修改
names.rsp文件,添加运行时库与正确选项:
-o mys.exe \ ALLOCATED_ARRAY_DATA.o \ ALLOCATED_MEMORY.o \ ALLOCATED_MEMORY_Interface.o \ ../superlu/src/c_fortran_dgssv.o \ ../superlu/lib/superlu.a \ ../superlu/lib/libopenblas.a \ -L/path/to/gcc/lib \ -lgfortran \ -lgcc \ -lquadmath \ -lmsvcrt \ -lkernel32
-L后替换为你实际的GCC库搜索路径-lgfortran、-lgcc等是Fortran与C运行时必需的依赖库- Windows环境下需要额外添加
-lmsvcrt、-lkernel32这类系统库
- 执行链接命令:
ld @"names.rsp"
关键注意事项:
- 原
names.rsp中的/o mys.exe是错误写法,ld的输出选项应为-o mys.exe(以短横线开头) - 目标文件与库的顺序不能乱:调用其他符号的文件放在前面,被依赖的库放在后面,否则会触发未定义符号错误
- 静态库之间如果存在依赖关系,也要按正确顺序排列(比如superlu依赖openblas,那么superlu库要放在openblas库前面)
内容的提问来源于stack exchange,提问作者realbabilu
相关产品推荐
相关产品推荐

