我有一个file.cpp,我从windows移植到linux。我已经更改了所有特定的标题和函数,但我仍然遇到了这个错误。这是我的代码。
#define _CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES 1
#define _CRT_SECURE_NO_DEPRECATE 1
#include <stdio.h>
#include <curses.h>
#include <termios.h>
#include <term.h>
#include <unistd.h>
#include "BioPlux.h"
#define BUF_SIZ 1000
static struct termios initial_settings, new_settings;
static int peek_character = -1;
int kbhit();
int kbhit()
{
char ch;
int nread;
if(peek_character != -1)
return 1;
new_settings.c_cc[VMIN]=0;
tcsetattr(0, TCSANOW, &new_settings);
nread = read(0,&ch,1);
new_settings.c_cc[VMIN]=1;
tcsetattr(0, TCSANOW, &new_settings);
if(nread == 1) {
peek_character = ch;
return 1;
}
return 0;
}
int main()
{
BP::Device::Frame frames[BUF_SIZ];
FILE *f = fopen("teste.txt", "w");
BP::Device *dev = NULL;
try
{
// decomment next block to search for bioPlux devices
/*
std::vector<std::string> devs;
BP::Device::FindDevices(devs);
fprintf(f, "FindDevices: %d\n", devs.size());
for(int i=0; i < devs.size(); i++)
fprintf(f, "%s\n", devs[i].c_str());
*/
dev = BP::Device::Create("00:07:80:40:DD:D8"); // put here the MAC address of your device
std::string str;
dev->GetDescription(str);
printf("Description: %s\n", str.c_str());
fprintf(f, "# Description: %s\n", str.c_str());
dev->SetDOut(true); // put the digital output at HIGH - useless
dev->BeginAcq(); // 1000 Hz, 12 bits, 6/8 channels
//dev->BeginAcq(1000, 0x01, 12); // 1000 Hz, 12 bits, channel 1 only
//for(int k = 0; k < 10; k++) // total 10 seconds
while(!kbhit())
{
dev->GetFrames(BUF_SIZ, frames); // block for 1 sec
putchar('*');
for(int i=0; i < BUF_SIZ; i++) // while the data to file
{
fprintf(f, "%i", frames[i].seq);
for(int j = 0; j < 8; j++)
fprintf(f, "\t%i", frames[i].an_in[j]);
fputc('\n', f);
}
}
dev->EndAcq();
} // end try
catch (BP::Err err)
{
char const *typ;
switch(err.GetType())
{
case BP::Err::TYP_ERROR:
typ = "Error";
break;
case BP::Err::TYP_NOTIFICATION:
typ = "Notification";
break;
}
printf("Error: %d Type: %s - %s\n", err.code, typ, err.GetDescription());
}
if (dev) delete dev;
fclose(f);
return 0;
}
这是file.cpp,其中包含以上标题。这个类在这里定义。
#include <vector>
#include <string>
#include <inttypes.h>
typedef unsigned char BYTE;
typedef unsigned short WORD;
#ifndef _BIOPLUXHEADER_
#define _BIOPLUXHEADER_
namespace BP
{
class Device
{
public:
struct Frame
{
BYTE seq;
bool dig_in;
WORD an_in[8];
};
static void FindDevices(std::vector<std::string> &devs);
static Device* Create(const std::string &port);
virtual void GetDescription(std::string &str)=0;
virtual void BeginAcq(void)=0;
virtual void BeginAcq(int freq, BYTE chmask, BYTE nbits)=0;
virtual void GetFrames(int nframes, Frame *frames)=0;
virtual void SetDOut(bool dout)=0;
virtual void EndAcq(void)=0;
virtual ~Device() {}
};
class Err
{
public:
enum Code {
// Notifications
//BT_AUTHENTICATION,
BT_ADDRESS = 1,
BT_ADAPTER_NOT_FOUND,
BT_DEVICE_NOT_FOUND,
CONTACTING_DEVICE,
PORT_COULD_NOT_BE_OPENED,
// Errors
PORT_INITIALIZATION,
//FIRMWARE_NOT_SUPPORTED,
DEVICE_NOT_IDLE,
DEVICE_NOT_IN_ACQUISITION_MODE,
PORT_COULD_NOT_BE_CLOSED,
BT_DEVICE_NOT_PAIRED,
INVALID_PARAMETER,
FUNCTION_NOT_SUPPORTED
} code;
enum Type {
TYP_ERROR,
TYP_NOTIFICATION
};
Err(Code c) : code(c) {}
Type GetType(void);
const char* GetDescription(void);
};
}
#endif
这是编译尝试的输出:
samuelpedro@ubuntu:~/Desktop/bioPlux API/C++$ g++ -o bttest_simple bttest_simple.cpp -lbluetooth BioPlux.lib
/tmp/cccJUI8I.o: In function `main':
bttest_simple.cpp:(.text+0xf8): undefined reference to `BP::Device::Create(std::string const&)'
bttest_simple.cpp:(.text+0x426): undefined reference to `BP::Err::GetType()'
bttest_simple.cpp:(.text+0x459): undefined reference to `BP::Err::GetDescription()'
collect2: error: ld returned 1 exit status
答案 0 :(得分:1)
您对class BP::Device
的定义包含一个名为Create()
的方法的声明,但没有代码,因此必须在某个源文件中定义它。您的Windows构建是否包含具有其定义的源文件?因为您的链接显然不包含该文件,如果它存在。如果您使用的是Visual Studio,则必须将该文件添加到项目中,否则添加包含它的库。