错误未定义引用`BP :: Device :: Create(std :: string const&)'

时间:2012-12-12 21:56:20

标签: c++ linux windows

我有一个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

1 个答案:

答案 0 :(得分:1)

您对class BP::Device的定义包含一个名为Create()的方法的声明,但没有代码,因此必须在某个源文件中定义它。您的Windows构建是否包含具有其定义的源文件?因为您的链接显然不包含该文件,如果它存在。如果您使用的是Visual Studio,则必须将该文件添加到项目中,否则添加包含它的库。