【问题标题】:How to pass object as parameter into function from .h and .cpp如何将对象作为参数从 .h 和 .cpp 传递给函数
【发布时间】:2019-11-09 23:13:25
【问题描述】:

我对 C++ 比较陌生,但来自 Python 和 C。

我正在使用用于激光雷达传感器的 SDK。我有 5 个主要文件涉及; SDK.hSDK.cppsetup.hsetup.cppmain.cpp

在 SDK 中定义了一个类。

rplidar.h

class RPlidarDriver{
public:
    static RPlidarDriver * CreateDriver(_u32 drivertype = DRIVER_TYPE_SERIALPORT);
    // more code
}

main.cpp

#include <iostream>
#include "rplidar.h"
#include "setup.h"

using namespace std;
using namespace rp::standalone::rplidar;

int main()
{
    //code

    RPlidarDriver* lidar = RPlidarDriver::CreateDriver(DRIVER_TYPE_SERIALPORT);

    start_reading(lidar, scanMode);

    //code
}

setup.cpp

#include "setup.h"
#include "rplidar.h"

using namespace std;
using namespace rp::standalone::rplidar;

void start_reading(RPlidarDriver* driver, const char* scanMode)
{
    //start motor
    driver->startMotor();

    //more code...

}

setup.h

#include "rplidar.h"
using namespace rp::standalone::rplidar;

namespace setup
{
    void start_reading(RPlidarDriver* driver, const char* scanMode);
}

但是我得到了这个错误

main.obj : error LNK2019: unresolved external symbol "void __cdecl setup::start_reading(class rp::standalone::rplidar::RPlidarDriver *,char const *)" (?start_reading@setup@@YAXPAVRPlidarDriver@rplidar@函数_main中引用的standalone@rp@@PBD@Z)

我尝试将对象用作参数的其他函数也遇到相同的错误。

如果我将setup.cpp 中的函数放入main.cpp,它很容易编译。我尝试实现&amp; 并使用参数作为参考,但不是运气。

【问题讨论】:

  • 您如何编译和链接您的文件?您是否将所有目标文件链接在一起? Good C++ book应该已经解释了编译的过程。
  • 是的,我通过定义包含目录(sdk 文件所在的位置)并使用 Visual Studio 编译来链接
  • 定义包含目录,与将文件或库链接在一起没有任何关系。您是否从您正在使用的 SDK 链接到适当的 .lib 文件?
  • 是的,我在属性的链接器部分添加了 .lib 文件。当我把 setup.cpp 的函数放到 main.cpp 中时,我就可以运行这个类了。所以我认为这意味着SDK必须正确编译?但我觉得我从 main.cpp 中错误地调用了该对象。
  • 哦,我明白了问题所在,我确信有一个重复的问题,但在一天中的这个时间太累了,无法搜索。您将start_reading 声明为属于namespace setup,但定义在全局范围内,而不是namespace setup

标签: c++ visual-studio visual-studio-2010 object sdk


【解决方案1】:

main.cppsetup.cpp 都需要编译,生成的目标文件需要与 SDK 库一起链接在一起。您得到的错误是告诉您您正在尝试仅使用 main.o 和没有 setup.o 的 SDK 链接最终二进制文件,这就是链接器无法通过您的 start_reading 函数的实现找到符号的原因。

【讨论】:

  • 当你说 main.cpp 和 setup.cpp 需要编译并与 SDK 库链接时,Visual Studio 不这样做吗?该项目已与 .lib 链接
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-04-15
  • 2018-03-15
  • 2019-07-23
  • 2018-05-25
  • 1970-01-01
相关资源
最近更新 更多