【问题标题】:GCC Merge two differents object files to one object file [duplicate]GCC将两个不同的目标文件合并到一个目标文件中[重复]
【发布时间】:2016-01-22 07:13:14
【问题描述】:
 // f.for is a Fortran source file
 // c.c is a C source file   
 # gfortran -c f.for            // produce f.o
 # gcc -c c.c                   // produce c.o

因为 f.forc.c 调用了一些函数。如何生成第三个目标文件 fc.o,稍后将使用它来生成带有另一个 C 源代码的可执行文件。解释:

 # gcc/gfortran? (or other) -?? f.o c.o -o fc.o
 # gcc -o executable source.c fc.o  

谢谢

我做了什么但没有工作:

  # ar rvs fc.a f.o c.o  
  # gcc -o executable source.c fc.a  

但它向我显示如下错误:undefined reference to 'function_name_X'. function_name_X is in f.for

【问题讨论】:

  • ar rvs fc.a f.o c.o 将为您提供一个静态库 (fc.a),您可以将其用作通过合并 f.oc.o 生成的目标文件。
  • PSkocik:是的,我会再试一次这个解决方案,也许它是唯一的解决方案
  • 你试过ld -r f.o c.o -o fc.o吗? (Dark Falcon 的链接)
  • 您可能问错了问题。如果您在同一个构建过程中生成所有这些目标文件,那么您不需要制作组合目标文件。您可以将所有需要的目标文件链接在一起以生成最终的可执行文件。
  • John Bollinger -> 我有这样的想法:如果 a.o 依赖于 b.o,c.c 依赖于 a.o ,那么 # gcc -o exe c.c a.o b.o 会起作用吗?

标签: c gcc fortran static-linking gfortran


【解决方案1】:

学分:PSkocik, John Bollinger
我的评论:

我有这样的想法:如果 a.o 依赖于 b.o,则 c.c 依赖于 在 a.o 上,所以 # gcc -o exe c.c a.o b.o 会起作用吗?

应该有效。事实上,我在 f.o 中列出了所有功能:

 # nm f.o  

我发现 Fortran 在每个函数名称的末尾都添加了下划线“_”,因为我是从 C 中调用这些函数而没有在末尾添加下划线,所以发生了这个错误。 根据这个question:我在生成f.o时将-fno-underscoring添加到gfortran编译器中

# gfortran -c f.for -fno-underscoring
# nm f.o

此时,末尾没有下划线。
回答问题:

# gcc -o executable source.c f.o c.o  // not need fc.o  

【讨论】:

    猜你喜欢
    • 2011-02-28
    • 1970-01-01
    • 2017-05-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-11-16
    • 1970-01-01
    相关资源
    最近更新 更多