【问题标题】:Extern undefined symbol外部未定义符号
【发布时间】:2015-11-17 06:03:24
【问题描述】:

我正在构建一个用户定义的 shell,其中 shell 动态链接库

我在包含全局变量声明的主文件中有以下 sn-p...

char *prompt = "upsh";
int main()
{ ...

然后我有一个共享库如下...

extern char *prompt;

int setprompt(char *argv[]) {
    prompt = argv[1];
    return 0;
}

我的问题是当我从主程序链接库时出现错误

./setprompt.so: undefined symbol: prompt

...也许这是一个编译问题?

【问题讨论】:

  • 请提供编译步骤。

标签: c dll shared-libraries extern


【解决方案1】:

正如 Naveem Kumar 所说,您应该提供编译步骤。以下内容是否重现了您的意思?这适用于我的笔记本电脑。

生成文件

all: main
libsetprompt.so: setprompt.c
    gcc -fPIC -DPIC -shared setprompt.c -o libsetprompt.so
main: main.c libsetprompt.so
    gcc main.c -o main -L. -lsetprompt
clean:
    rm main libsetprompt.so

ma​​in.c

char *prompt = "upsh";
int main(int argc, char *argv[])
{ return 0; }

setprompt.c

extern char *prompt;
int setprompt(char *argv[])
{
    prompt = argv[1];
    return 0;
}

【讨论】:

  • 这对我不起作用。 -lsetprompt 选项是什么?
  • 这个例子有什么错误?顺便说一句,-L 表示在链接时在哪里可以找到库,而 -lname 在那个阶段搜索 libname.a 或 libname.so。此外,您可能需要设置 LD_LIBRARY_PATH 以便可以在运行时找到 libsetprompt.so。
【解决方案2】:

我不认为这是一个编译问题。如果我没看错,你有一个控制台应用程序,这意味着 argc 和 argv 必须传递给 main 函数才能使用它们,但它们没有传递。我猜你的问题是你调用int setprompt(char *argv[]) 没有实际传递argv []。但我可能是错的,更多的代码将有助于确定。

但可能应该是int main(int argc, char **argv)而不是int main()

【讨论】:

  • 不是这样,我在代码后面的地方声明char *argv[]
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-01-08
相关资源
最近更新 更多