Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/137.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ SD总线源文件编译问题_C++_Systemd - Fatal编程技术网

C++ SD总线源文件编译问题

C++ SD总线源文件编译问题,c++,systemd,C++,Systemd,我复制总线服务。C可用@到C++源文件BUS Service .CPP。如果我使用g++编译生成错误编译.cpp文件,有人能帮助我克服生成问题吗 用于生成的命令: g++ bus-service.cpp -lsystemd 保存以下代码bus service.c文件不会导致以下命令出错: g++ bus-service.cpp -lsystemd 下面是来自上述链接的源代码: /* start of bus-service.cpp */ #include < stdio.h >

我复制总线服务。C可用@到C++源文件BUS Service .CPP。如果我使用g++编译生成错误编译.cpp文件,有人能帮助我克服生成问题吗

用于生成的命令:

g++ bus-service.cpp -lsystemd
保存以下代码bus service.c文件不会导致以下命令出错:

g++ bus-service.cpp -lsystemd
下面是来自上述链接的源代码:

/* start of bus-service.cpp */ 
#include < stdio.h > #include < stdlib.h > #include < errno.h > #include < systemd / sd - bus.h >

  static int method_multiply(sd_bus_message * m, void * userdata, sd_bus_error * ret_error) {
    int64_t x, y;
    int r;

    /* Read the parameters */
    r = sd_bus_message_read(m, "xx", & x, & y);
    if (r < 0) {
      fprintf(stderr, "Failed to parse parameters: %s\n", strerror(-r));
      return r;
    }

    /* Reply with the response */
    return sd_bus_reply_method_return(m, "x", x * y);
  }

static int method_divide(sd_bus_message * m, void * userdata, sd_bus_error * ret_error) {
  int64_t x, y;
  int r;

  /* Read the parameters */
  r = sd_bus_message_read(m, "xx", & x, & y);
  if (r < 0) {
    fprintf(stderr, "Failed to parse parameters: %s\n", strerror(-r));
    return r;
  }

  /* Return an error on division by zero */
  if (y == 0) {
    sd_bus_error_set_const(ret_error, "net.poettering.DivisionByZero", "Sorry, can't allow division by zero.");
    return -EINVAL;
  }

  return sd_bus_reply_method_return(m, "x", x / y);
}

/* The vtable of our little object, implements the net.poettering.Calculator interface */
static
const sd_bus_vtable calculator_vtable[] = {
  SD_BUS_VTABLE_START(0),
  SD_BUS_METHOD("Multiply", "xx", "x", method_multiply, SD_BUS_VTABLE_UNPRIVILEGED),
  SD_BUS_METHOD("Divide", "xx", "x", method_divide, SD_BUS_VTABLE_UNPRIVILEGED),
  SD_BUS_VTABLE_END
};

int main(int argc, char * argv[]) {
  sd_bus_slot * slot = NULL;
  sd_bus * bus = NULL;
  int r;

  /* Connect to the user bus this time */
  r = sd_bus_open_user( & bus);
  if (r < 0) {
    fprintf(stderr, "Failed to connect to system bus: %s\n", strerror(-r));
    goto finish;
  }

  /* Install the object */
  r = sd_bus_add_object_vtable(bus, & slot,
    "/net/poettering/Calculator", /* object path */
    "net.poettering.Calculator", /* interface name */
    calculator_vtable,
    NULL);
  if (r < 0) {
    fprintf(stderr, "Failed to issue method call: %s\n", strerror(-r));
    goto finish;
  }

  /* Take a well-known service name so that clients can find us */
  r = sd_bus_request_name(bus, "net.poettering.Calculator", 0);
  if (r < 0) {
    fprintf(stderr, "Failed to acquire service name: %s\n", strerror(-r));
    goto finish;
  }

  for (;;) {
    /* Process requests */
    r = sd_bus_process(bus, NULL);
    if (r < 0) {
      fprintf(stderr, "Failed to process bus: %s\n", strerror(-r));
      goto finish;
    }
    if (r > 0) /* we processed a request, try to process another one, right-away */
      continue;

    /* Wait for the next request to process */
    r = sd_bus_wait(bus, (uint64_t) - 1);
    if (r < 0) {
      fprintf(stderr, "Failed to wait on bus: %s\n", strerror(-r));
      goto finish;
    }
  }

  finish:
    sd_bus_slot_unref(slot);
  sd_bus_unref(bus);

  return r < 0 ? EXIT_FAILURE : EXIT_SUCCESS;
}

/* end of bus-service.c */

用下面指示的宏替换SD_总线_VTABLE_开始、SD_总线_方法和SD_总线_VTABLE_结束,我能够解决构建问题

#define __SD_BUS_VTABLE_START(_flags)  { _SD_BUS_VTABLE_START, _flags,  .x = {.start = {sizeof(sd_bus_vtable)}}}

#define __SD_BUS_METHOD_WITH_OFFSET(_member, _signature, _result, _handler, _offset, _flags)   \
        {                                                               \
                _SD_BUS_VTABLE_METHOD,          \
                _flags,                         \
                .x = {.method = {_member,       \
                _signature,                     \
                _result,                        \
                _handler,                       \
                _offset}}                       \
        }
#define __SD_BUS_METHOD(_member, _signature, _result, _handler, _flags)  \
        __SD_BUS_METHOD_WITH_OFFSET(_member, _signature, _result, _handler, 0, _flags)

#define __SD_BUS_SIGNAL(_member, _signature, _flags)                    \
        {                                                               \
                _SD_BUS_VTABLE_SIGNAL,                                  \
                _flags,                                                 \
                .x = {.signal = {_member,                               \
                _signature}}                                            \
        }

#define __SD_BUS_PROPERTY(_member, _signature, _get, _offset, _flags)  \
        {                                                              \
                _SD_BUS_VTABLE_PROPERTY,                               \
                _flags,                                                \
                .x = {.property = {(const char*)_member,               \
                (const char*)_signature,                               \
                (sd_bus_property_get_t)_get,                           \
                (sd_bus_property_get_t)0,                              \
                (size_t)_offset}}                                      \
        }

#define __SD_BUS_WRITABLE_PROPERTY(_member, _signature, _get, _set, _offset, _flags) \
        {                                                               \
                _SD_BUS_VTABLE_WRITABLE_PROPERTY,                       \
                _flags,                                                 \
                .x = {.property = {_member,                             \
                 _signature,                                            \
                _get,                                                   \
                _set,                                                   \
                _offset}}                                               \
        }

#define __SD_BUS_VTABLE_END                                             \
        {                                                               \
                _SD_BUS_VTABLE_END                                      \
        }

你检查过预处理器的输出了吗?尝试g++-E bus-service.cpp了解编译器的抱怨。U+2018代表左单引号,2019代表右单引号。也许你的网站通过将ASCII引号改为Unicode引号将代码从混乱的格式中解救出来了?
#define __SD_BUS_VTABLE_START(_flags)  { _SD_BUS_VTABLE_START, _flags,  .x = {.start = {sizeof(sd_bus_vtable)}}}

#define __SD_BUS_METHOD_WITH_OFFSET(_member, _signature, _result, _handler, _offset, _flags)   \
        {                                                               \
                _SD_BUS_VTABLE_METHOD,          \
                _flags,                         \
                .x = {.method = {_member,       \
                _signature,                     \
                _result,                        \
                _handler,                       \
                _offset}}                       \
        }
#define __SD_BUS_METHOD(_member, _signature, _result, _handler, _flags)  \
        __SD_BUS_METHOD_WITH_OFFSET(_member, _signature, _result, _handler, 0, _flags)

#define __SD_BUS_SIGNAL(_member, _signature, _flags)                    \
        {                                                               \
                _SD_BUS_VTABLE_SIGNAL,                                  \
                _flags,                                                 \
                .x = {.signal = {_member,                               \
                _signature}}                                            \
        }

#define __SD_BUS_PROPERTY(_member, _signature, _get, _offset, _flags)  \
        {                                                              \
                _SD_BUS_VTABLE_PROPERTY,                               \
                _flags,                                                \
                .x = {.property = {(const char*)_member,               \
                (const char*)_signature,                               \
                (sd_bus_property_get_t)_get,                           \
                (sd_bus_property_get_t)0,                              \
                (size_t)_offset}}                                      \
        }

#define __SD_BUS_WRITABLE_PROPERTY(_member, _signature, _get, _set, _offset, _flags) \
        {                                                               \
                _SD_BUS_VTABLE_WRITABLE_PROPERTY,                       \
                _flags,                                                 \
                .x = {.property = {_member,                             \
                 _signature,                                            \
                _get,                                                   \
                _set,                                                   \
                _offset}}                                               \
        }

#define __SD_BUS_VTABLE_END                                             \
        {                                                               \
                _SD_BUS_VTABLE_END                                      \
        }