【发布时间】:2019-11-09 23:13:25
【问题描述】:
我对 C++ 比较陌生,但来自 Python 和 C。
我正在使用用于激光雷达传感器的 SDK。我有 5 个主要文件涉及; SDK.h、SDK.cpp、setup.h、setup.cpp 和 main.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,它很容易编译。我尝试实现& 并使用参数作为参考,但不是运气。
【问题讨论】:
-
您如何编译和链接您的文件?您是否将所有目标文件链接在一起? 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