2

我写了一个这样的测试程序:

#include <sys/socket.h>
int main( void ) {
    int  sock = socket(AF_INET, SOCK_DGRAM, 0);
    return 0;
}

并试图编译它:

$ /tool/sunstudio/bin/cc test.c
Undefined                       first referenced
 symbol                             in file
socket                              test.o
ld: fatal: Symbol referencing errors. No output written to a.out

输出为“未引用符号套接字”。

请给我方向,以便我可以解决这个问题。

4

3 回答 3

6

这是问题。

我写了一个这样的测试程序:

#include <sys/socket.h>
int main( void ) {
    int  sock = socket(AF_INET, SOCK_DGRAM, 0);
    return 0;
}

并尝试编译它(这是真正有帮助的输出,您必须记住,现代编译器确实尽力帮助您解决任何问题):

$ /tool/sunstudio/bin/cc test.c
Undefined                       first referenced
 symbol                             in file
socket                              test.o
ld: fatal: Symbol referencing errors. No output written to a.out

现在,从输出中我们可以看到该符号socket没有被引用。因此,如果您键入man socket,您将从手册页中获得以下信息:

SYNOPSIS
     cc [ flag ... ] file ... -lsocket  -lnsl  [ library ... ]

-l标志表示要使用此功能,您还需要链接命名库。在这种情况下,您被告知添加-lsocket -lnslcc命令行,如下所示:

$ /tool/sunstudio/bin/cc test.c -lsocket -lnsl
于 2010-10-11T11:54:38.240 回答
2

您必须在命令行中链接套接字库:

-lsocket 
于 2010-10-11T11:45:49.900 回答
2

您至少需要添加-lsocket到您的链接步骤,即针对 libsocket.so 的链接。不过,我不知道如何在 SunStudio UI 中执行此操作 - 它的项目是否基于 makefile?

手册页通常是查找所需库的好地方;在这种情况下,socket 的手册页也推荐-lnsl(参见概要),所以这也可能是必需的,但我不记得它是必要的。

于 2010-10-11T11:46:26.607 回答