【问题标题】:calling an extern (static) function in c++在 C++ 中调用外部(静态)函数
【发布时间】:2026-02-24 00:45:01
【问题描述】:

我正在尝试将一些 c++ 函数放在一起。我有一个包含这两个函数的文件:

double fun1(double *x, int y, double *z){
....
}

static
double fun2(double a, double b, int c){
...
}

现在,fun1 调用 fun2。我想在单独的文件中使用 fun1 (separate.cpp),所以我这样做了:

extern double fun1(double *x, int y, double *z);

在 (separate.cpp) 文件的开头。

  • 问题:我也应该写

    extern double fun2(double a, double b, int c);

separate.cpp 的开头,如果是这样,怎么办? (我是否还应该在其中包含 static 关键字,在 extern 旁边?)

我认为我的主要问题是我以前从未使用过static 函数,所以我真的不知道如何处理它们。

目前,代码可以编译,但加载后我得到:

unable to load shared object '/R/x86_64-pc-linux-gnu-library/3.1/abc/libs/abc.so':
  /R/x86_64-pc-linux-gnu-library/3.1/abc/libs/abc.so: undefined symbol: _Z6fun1PdiS_Pi

【问题讨论】:

  • Doesn't using static for a definition made inside a translation unit(与c相同),实际上隐藏了定义,使其不被另一个TU链接可见?
  • 如果静态是全局函数(不是方法),则删除它。这种静态意味着本地(其他文件不可见)。
  • 在此上下文中,static 对当前翻译单元之外的所有内容隐藏了该功能。所以只能被同一个翻译单元中的函数调用。
  • 您确定错误消息,特别是错误的名称_Z6fun1PdiS_Pic++filt 程序无法破译它。
  • @TonyK: fun1 不是函数的真实名称....实际名称要长一些:)

标签: c++


【解决方案1】:

不,您不需要在单独的文件中声明静态函数,因为那里的代码不需要知道任何关于它的信息。实际上,使函数静态化的目的是使其在定义它的文件中保持本地:它不能被视为其他文件中的外部函数。

您收到的错误消息是关于未找到的 fun1。编译和链接separate.cpp 时必须提供包含fun1 的目标文件。

【讨论】:

  • 谢谢。包含 fun1 定义的文件位于同一个文件夹中,因此只需使用 extern 关键字声明函数就足够了——至少我对其他函数是这样做的,不知道为什么这个不能这样工作.
  • fun1 的声明必须对调用fun1的代码可见