我对C++相当陌生,但是这件事使我对任何逻辑都感到困惑。我的代码如下:

#include "stdlib.h"
#include "syslog.h"
#include "unistd.h"
#include "sys/stat.h"
#include "X11/Xlib.h"
#include "cstdio"

void process();
void startTracker();

Display *display;
Window rootWindow;
XEvent xevent;

我包含了Xlib header ,如果我单击Eclipse中的成员函数,它会导航到定义。
int main(int argc, char *argv[])
{
    // set logging up
    openlog("unison", LOG_CONS|LOG_PID|LOG_NDELAY, LOG_LOCAL1);

    syslog(LOG_NOTICE, "Starting Unison Handler");

    pid_t pid, sid;

    pid = fork();

    // fork failed
    if (pid < 0) {
        exit(EXIT_FAILURE);
    }

    if (pid > 0) {
        exit(EXIT_SUCCESS);
    }

    umask(0);

    sid = setsid();
    if (sid < 0) {
        exit(EXIT_FAILURE);
    }

    if (chdir("/") < 0) {
        exit(EXIT_FAILURE);
    }

    close(STDIN_FILENO);
    close(STDOUT_FILENO);
    close(STDERR_FILENO);

    startTracker();

    while (true) {
        process();
    }

    closelog();
    return(EXIT_SUCCESS);
}

然后我为输入选择分配变量
void startTracker() {
    display = XOpenDisplay(0);
    rootWindow = XRootWindow(display, 0);
    XSelectInput(display, rootWindow, PointerMotionMask);

}

void process()
{

...但是当我在此处添加&event ...
    XNextEvent(display, &xevent);
    switch (xevent.type) {
        case MotionNotify:
            syslog(
                    LOG_NOTICE,
                    "Mouse position is %dx%d",
                    xevent.xmotion.x_root, xevent.xmotion.y_root
            );
    }
}

...整个事情都崩溃了。

出于某种原因,将xevent作为引用传递会抛出整个Xlib header ,并为此提供给我:

00:16:15 ****为项目统一构建配置调试****
全部制作
构建文件:../ unisond.cpp
调用:GCC C++编译器
g++ -O0 -g3 -Wall -c -fmessage-length = 0 -MMD -MP -MF“unisond.d” -MT“unisond.d” -o“unisond.o”“../unisond.cpp”
完成的建筑物:../ unisond.cpp

建筑目标:一致
调用:GCC C++链接器
g++ -o“unisond” ./unisond.o
./unisond.o:在函数startTracker()中:
/home/ancarius/workspace/unisond/Debug/../unisond.cpp:97:对“XOpenDisplay”的 undefined reference
/home/ancarius/workspace/unisond/Debug/../unisond.cpp:98:对“XRootWindow”的 undefined reference
/home/ancarius/workspace/unisond/Debug/../unisond.cpp:99:对“XSelectInput”的 undefined reference
./unisond.o:在函数`process()'中:
/home/ancarius/workspace/unisond/Debug/../unisond.cpp:105:对“XNextEvent”的 undefined reference
collect2:错误:ld返回1退出状态
make:*** [unisond]错误1

00:16:15构建完成(耗时159ms)

冒着被选票的风险,有人可以解释我做错了什么吗?我已经尝试了所有我能想到的,但是没有运气。

最佳答案

看来您缺少用于链接的X11库。

-lX11添加到g++调用中。

This提供了所需的步骤。

关于c++ - 通过引用传递变量时“Undefined reference”错误,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/18563217/

10-13 21:28