c++ - 使用混合 C 和 C++ 对函数的 undefined reference

标签 c++ c methods properties header

我在尝试将一些 C 代码合并到 C++ 项目时收到 undefined reference to 'mgmt_new_default()' 错误。

我试图在我的类的构造函数中设置一个属性。这个类叫做SocketManager

套接字管理器.h

#ifndef SOCKETMANAGER_H
#define SOCKETMANAGER_H
#include "bluetooth/src/mgmt.h"
class SocketManager
{
public:
SocketManager();

struct mgmt *management;

//MGMT-related methods
void Initialize();
void StartDiscovery();
};

#endif // SOCKETMANAGER_H

socketmanager.c(带有导致错误的错误代码)

#include "socketmanager.h"
#include "bluetooth/src/mgmt.h"

SocketManager::SocketManager()
{
    this->management = mgmt_new_default();
}

函数mgmt_new_default(void)来自一个名为mgmt.c的文件,下面是header和body。

管理.h

#ifndef MGMT2_H
#define MGMT2_H

#include <stdbool.h>
#include <stdint.h>

#define MGMT_VERSION(v, r) (((v) << 16) + (r))

typedef void (*mgmt_destroy_func_t)(void *user_data);

struct mgmt;

struct mgmt *mgmt_new(int fd);
struct mgmt *mgmt_new_default(void);

struct mgmt *mgmt_ref(struct mgmt *mgmt);
void mgmt_unref(struct mgmt *mgmt);

typedef void (*mgmt_debug_func_t)(const char *str, void *user_data);

bool mgmt_set_debug(struct mgmt *mgmt, mgmt_debug_func_t callback,
            void *user_data, mgmt_destroy_func_t destroy);

bool mgmt_set_close_on_unref(struct mgmt *mgmt, bool do_close);

typedef void (*mgmt_request_func_t)(uint8_t status, uint16_t length,
                const void *param, void *user_data);

unsigned int mgmt_send(struct mgmt *mgmt, uint16_t opcode, uint16_t index,
                uint16_t length, const void *param,
                mgmt_request_func_t callback,
                void *user_data, mgmt_destroy_func_t destroy);
unsigned int mgmt_send_nowait(struct mgmt *mgmt, uint16_t opcode,     uint16_t index,
                uint16_t length, const void *param,
                mgmt_request_func_t callback,
                void *user_data, mgmt_destroy_func_t destroy);
unsigned int mgmt_reply(struct mgmt *mgmt, uint16_t opcode, uint16_t index,
                uint16_t length, const void *param,
                mgmt_request_func_t callback,
               void *user_data, mgmt_destroy_func_t destroy);
bool mgmt_cancel(struct mgmt *mgmt, unsigned int id);
bool mgmt_cancel_index(struct mgmt *mgmt, uint16_t index);
bool mgmt_cancel_all(struct mgmt *mgmt);

typedef void (*mgmt_notify_func_t)(uint16_t index, uint16_t length,
                const void *param, void *user_data);

unsigned int mgmt_register(struct mgmt *mgmt, uint16_t event, uint16_t index,
            mgmt_notify_func_t callback,
            void *user_data, mgmt_destroy_func_t destroy);
bool mgmt_unregister(struct mgmt *mgmt, unsigned int id);
bool mgmt_unregister_index(struct mgmt *mgmt, uint16_t index);
bool mgmt_unregister_all(struct mgmt *mgmt);

#endif // MGMT2_H

mgmt.c(只是冲突 mgmt_new_default() )

struct mgmt *mgmt_new_default(void)
{
struct mgmt *mgmt;
union {
    struct sockaddr common;
    struct sockaddr_hci hci;
} addr;
int fd;

fd = socket(PF_BLUETOOTH, SOCK_RAW | SOCK_CLOEXEC | SOCK_NONBLOCK,
                            BTPROTO_HCI);
if (fd < 0)
    return NULL;

memset(&addr, 0, sizeof(addr));
addr.hci.hci_family = AF_BLUETOOTH;
addr.hci.hci_dev = HCI_DEV_NONE;
addr.hci.hci_channel = HCI_CHANNEL_CONTROL;

if (bind(fd, &addr.common, sizeof(addr.hci)) < 0) {
    close(fd);
    return NULL;
}

mgmt = mgmt_new(fd);
if (!mgmt) {
    close(fd);
    return NULL;
}

mgmt->close_on_unref = true;

return mgmt;
}

我不明白的是这个错误可能来自哪里?我觉得我需要第二双眼睛。我想我正确地实现了任何必要的头部保护,但这让我很困惑。

请注意,我没有直接使用 BlueZ 源代码,而是通过挑选一些我想要的文件并将它们“合并”到 C++ 项目中来进行试验。我“按原样”合并了 mgmt.cmgmt.h 文件,除了 header guard 之外没有做任何更改。

最佳答案

无论何时由 C++ 编译器编译,您的头文件都必须对 C 文件中定义的函数使用 extern "C"。在.h文件中使用的常用习语如下

#ifdef __cplusplus
extern "C" {
#endif
// your functions declarations
#ifdef __cplusplus
}
#endif

关于c++ - 使用混合 C 和 C++ 对函数的 undefined reference ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34160077/

相关文章:

c++ - C++ 中带有模板化事件类型的中央事件调度器

c++ - 如何从 QNetworkReply 读取内容(http 响应正文)

c++ - iOS 上的 OpenCV 对象检测 (HOGDescriptor)

ruby - Ruby 对象中是否有方法将自身传递给 block 或过程?

java - 使用 BCEL 调用方法

c++ - 编译有效,启动不是 - "standard path"?

Java 中的 Java 字节数组等效项

c - 如果 vfork() 调用 exec 族,为什么它不是未定义的?

c - 通过分割一个大的 malloc 内存来减少 malloc 调用

python-3.x - 将列表从另一个类传递给类内的方法,以便修改所述列表并传回 Python 中的原始类