C++ SD总线源文件编译问题
我复制总线服务。C可用@到C++源文件BUS Service .CPP。如果我使用g++编译生成错误编译.cpp文件,有人能帮助我克服生成问题吗 用于生成的命令: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 >
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 \
}