Ошибка связывания в Sun Studio 10 под Solaris - PullRequest
2 голосов
/ 11 октября 2010

Я написал такую ​​тестовую программу:

#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

Вывод «символьный сокет не указан».

Пожалуйста, дайте мне направление, чтобы я мог решить эту проблему.

Ответы [ 3 ]

6 голосов
/ 11 октября 2010

Вот вопрос.

Я написал такую ​​тестовую программу:

#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 -lnsl в командную строку cc следующим образом:

$ /tool/sunstudio/bin/cc test.c -lsocket -lnsl
2 голосов
/ 11 октября 2010

Вам нужно добавить как минимум -lsocket к вашему шагу ссылки, то есть ссылку на libsocket.so.Однако я не знаю, как это сделать в пользовательском интерфейсе SunStudio - основаны ли на его проектах файлы makefile?

Страница man, как правило, является хорошим местом для поиска необходимых библиотек;в этом случае справочная страница для сокета также рекомендует -lnsl (см. краткий обзор), так что это тоже может потребоваться, но я не помню, чтобы это было необходимо.

2 голосов
/ 11 октября 2010

вам нужно связать в библиотеке сокетов, в командной строке:

-lsocket 
...