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