【问题标题】:use a function before it's compiled在编译之前使用函数
【发布时间】:2014-07-10 21:27:44
【问题描述】:

由于其他要求,我必须按以下顺序编译这些文件:首先是 a,然后是 b。

现在文件的格式如下: 呵呵

void caller_func(void);

交流

#include "a.h"
#include "b.h"
void caller_func(void){
    called_func(void);
}

b.h

void called_func(void);

b.c

#include "b.h"
void called_func(void){
    //any action
}

在编译时我得到 a.so: 未定义对 'called_function' 的引用

有没有办法解决这个问题(除了改变编译顺序)?

【问题讨论】:

  • 如何调用编译器?可能是编译器不仅尝试编译而且还链接a
  • 如果你将a.c编译成a.ob.c编译成b.o,那么你必须将a.ob.o链接在一起。或者你可以一起编译:cc -o output a.c b.c

标签: c compilation


【解决方案1】:

编写的代码应该没有问题。 然而,您必须确保将 a.c 编译为 a.o 并将 b.c 编译为 b.o 链接它们。

您的编译行应如下所示:

gcc a.c b.c -o a.out

或者:

gcc -c a.c b.c 
ld -o a.out a.o b.o 

在第一个示例中,gcc 将在后台调用 ld 为您链接可执行文件。在第二个示例中,您明确执行了编译和链接步骤。

【讨论】:

    【解决方案2】:

    由于其他要求,我必须按以下顺序编译这些文件:首先是 a,然后是 b。

    不,您没有此要求。这两个模块彼此无关。

    如果其中一个模块包含在库中,您需要做的可能是按照正确的顺序进行链接。但我认为这不是问题所在。

    另一个提示:如果两者相同,则在此处定义之前包含声明并不重要!

    你要做的很简单:在一个阶段编译和链接

     gcc a.c b.c -o prog
    

    或分两步编译(顺序根本不重要)

     gcc a.c -c
     gcc b.c -c
    
     gcc a.o b.o -o prog
    

    所有这一切都基于你在 linux 上使用 gcc 的假设。但大多数其他编译器的行为方式相同。随时询问特殊的编译器或环境或操作系统。

    【讨论】:

    • 两个模块都在不同的库中,这就是迫使我首先编译的原因
    【解决方案3】:

    "undefined reference to ' called_function'" 表示链接器找不到编译b.c生成的机器码;要么您没有编译该文件,要么编译它生成的目标代码未包含在最终链接命令中。

    假设 gcc,你会做类似的事情

    gcc -c a.c          # compiles a.c, generates object file a.o
    gcc -c b.c          # compiles b.c, generates object file b.o
    gcc -o prog a.o b.o # links the object files into an executable named prog
    

    听起来你写了类似的东西

    gcc a.c
    

    编译 a.c,然后尝试将其链接到可执行文件(默认名称 a.outa.exe,取决于您的平台)。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-08-23
      • 1970-01-01
      • 2014-06-09
      • 2021-04-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-03-16
      相关资源
      最近更新 更多