C – 对WSAStartup @ 8’的未定义引用

我正在使用Code :: Blocks,MinGW和Windows。 我试图初始化winsock,以便我可以在项目上工作。 我一直收到错误Undefined Reference to WSAStartup@8任何人都知道如何解决此问题?

 #include  #include  #include  #pragma comment(lib,"ws2_32.lib") int main(int argc , char *argv[]){ WSADATA wsa; int output; output=WSAStartup(MAKEWORD(2,2),&wsa); if(output != 0) { printf("Startup failed %d\n", output); return 1; } else { printf("Initialized"); return 0; } } 

链接器在加载代码后查找依赖项。 如果库在构建过程中出现在需要符号之前,因为之后出现源文件,则不使用符号,稍后当它们出现在源文件中时,它们将无法解析。 将您链接的winsock库-lws2_32放在源文件和目标文件之后。

 gcc prog.c -o prog -lws2_32 

您的源代码显示您使用非常具体的(对Microsoft的编译器), #pragma comment(lib,"ws2_32.lib")语句。 这有两个问题:

  1. 该pragma在GCC(即MinGW编译器)中无效,因此在编译和链接时都会被忽略。
  2. 在MinGW中,(与大多数(可能是所有?)其他平台的GCC约定相同),没有“ws2_32.lib”; 库的正确名称(这是ws2_32.dll的导入库)是“libws2_32.a”。

要解决您的问题,您的源代码中不得依赖MSVC特定的编译指示; 相反,你必须在链接命令行上正确指定库,(几乎)如tinky_winky所示:

 gcc prog.c -o prog.exe [...other .c and .o files...] -lws2_32 ... 

(并确保您指定的任何库都位于目标文件或源文件之后,这些库需要它们)。

我做了另一种方式,我发现包含编译器无法链接的函数的库,然后我添加到编译器的链接器。 几乎所有的库都在MINGW的lib文件夹中(通常是C:/ MinGW / lib); 像这样这些是我在使用Dlib时遇到错误时添加的库或者你可以为auto regconite missing lib执行此指令。 在Code :: Blocks中构建wxWidgets程序

您可以检查compiler options ,添加-lws2_32add linker options when linking 。 我使用TDM-GCC,之后效果很好。