неопределенная ссылка на `FIFORequestChannel :: FIFORequestChannel - PullRequest
2 голосов
/ 05 октября 2019

Я пытаюсь скопировать значения данных из одного файла .csv в другой, но когда я компилирую, я получаю неопределенную ошибку ссылки. Я запутался, потому что я обязательно включил заголовочный файл. Кто-нибудь может предоставить какой-либо ввод?

client.cpp (основной):

 #include "common.h"
 #include "FIFOreqchannel.h" // this is where I included the header file

 #include <iostream>
 #include <string>
 #include <stdio.h>
 #include <sys/wait.h>

 using namespace std;



int main(int argc, char *argv[]){
 cout<<"test"<<endl;

int n = 100;    // default number of requests per "patient"
int p = 15;     // number of patients
srand(time_t(NULL));

struct timeval tv; // this is the starting struct
struct timeval ts;// this is the ending struct
gettimeofday(&tv, NULL); // starts the clock

FIFORequestChannel chan ("control", FIFORequestChannel::CLIENT_SIDE); // this is the creation of the server
//datamsg first = datamsg(1,59.996, 2); // This is the creation of the first datamsg. It gets the information for the first person, up to 59.996 seconds, and gets info from the second ecg.

//The next step is to create the file
string file = "x1.csv";


//gettimeofdayI(&start, null);
ofstream inputfile;
inputfile.open(file); // opens the data for the first person
double seconds = 0.0; 

while (seconds<59.996){

    datamsg ecg1 = datamsg(1,seconds,1); // gets the data from the first ECG
    datamsg ecg2 = datamsg(1,seconds,2); // gets the data from the second ECG

    //cout<<test<<endl;
    char*size= new char [sizeof(ecg1)];
    *(datamsg*)size=ecg1;
    chan.cwrite(size,sizeof(ecg1));
    char * read=chan.cread();
    double ecgfirst=*(double*)read;

    inputfile<<ecgfirst<<","<<"\n";

    char*size2= new char [sizeof(ecg2)];
    *(datamsg*)size2=ecg2;
    chan.cwrite(size2,sizeof(ecg2));
    char * read2=chan.cread();
    double ecgsecond=*(double*)read2;

    inputfile<<ecgsecond<<","<<"\n";


    seconds = seconds +.004; // this is the incrementation of the seconds


}

inputfile.close();
gettimeofday(&ts, NULL);

double totaltime; // this will count the total time of the process 
totaltime = ts.tv_sec-tv.tv_sec;
cout<<" The total time to get the info for person  is "<<totaltime<<"."<<endl;







// sending a non-sense message, you need to change this
char x = 55;
chan.cwrite (&x, sizeof (x));
char* buf = chan.cread ();


// closing the channel    
MESSAGE_TYPE m = QUIT_MSG;
chan.cwrite (&m, sizeof (MESSAGE_TYPE));


   }

FIFOreqchannel.h:

#ifndef _FIFOreqchannel_H_
#define _FIFOreqchannel_H_

#include "common.h"

  class FIFORequestChannel
   {
   public:
   enum Side {SERVER_SIDE, CLIENT_SIDE};
   enum Mode {READ_MODE, WRITE_MODE};

private:
/*  The current implementation uses named pipes. */


string my_name;
Side my_side;

int wfd;
int rfd;

string pipe1, pipe2;
int open_pipe(string _pipe_name, int mode);

 public:
  FIFORequestChannel(const string _name, const Side _side);
  /* Creates a "local copy" of the channel specified by the given name. 
   If the channel does not exist, the associated IPC mechanisms are 
   created. If the channel exists already, this object is associated with the channel.
   The channel has two ends, which are conveniently called "SERVER_SIDE" and "CLIENT_SIDE".
   If two processes connect through a channel, one has to connect on the server side 
   and the other on the client side. Otherwise the results are unpredictable.

 NOTE: If the creation of the request channel fails (typically happens when too many
 request channels are being created) and error message is displayed, and the program
 unceremoniously exits.

 NOTE: It is easy to open too many request channels in parallel. Most systems
 limit the number of open files per process.
*/

~FIFORequestChannel();
/* Destructor of the local copy of the bus. By default, the Server Side deletes any IPC 
 mechanisms associated with the channel. */

char* cread(int *len=NULL);
/* Blocking read of data from the channel. Returns a string of characters
 read from the channel. Returns NULL if read failed. */

int cwrite(void *msg, int msglen);
/* Write the data to the channel. The function returns the number of characters written
 to the channel. */

string name(); 
};

#endif

FIFOreqchannel.cpp:

#include "common.h"
#include "FIFOreqchannel.h"

using namespace std;

/*-------------------------------------------------------------------------- 
*/
/* CONSTRUCTOR/DESTRUCTOR FOR CLASS   R e q u e s t C h a n n e l  */
/*-------------------------------------------------------------------------- 
*/

FIFORequestChannel::FIFORequestChannel(const string _name, const Side _side) 
: my_name( _name), my_side(_side){
pipe1 = "fifo_" + my_name + "1";
pipe2 = "fifo_" + my_name + "2";

if (_side == SERVER_SIDE){
    wfd = open_pipe(pipe1, O_WRONLY);
    rfd = open_pipe(pipe2, O_RDONLY);
}
else{
    rfd = open_pipe(pipe1, O_RDONLY);
    wfd = open_pipe(pipe2, O_WRONLY);

}

}

FIFORequestChannel::~FIFORequestChannel(){ 
close(wfd);
close(rfd);

remove(pipe1.c_str());
remove(pipe2.c_str());
}

int FIFORequestChannel::open_pipe(string _pipe_name, int mode){
mkfifo (_pipe_name.c_str (), 0600);
int fd = open(_pipe_name.c_str(), mode);
if (fd < 0){
    EXITONERROR(_pipe_name);
}
return fd;
}

char* FIFORequestChannel::cread(int *len){
char * buf = new char [MAX_MESSAGE];
int length = read(rfd, buf, MAX_MESSAGE);
if (length < 0){
    EXITONERROR ("Connection Error");
}
if (len)    // the caller wants to know the length
    *len = length;
return buf;
}

int FIFORequestChannel::cwrite(void* msg, int len){
if (len > MAX_MESSAGE){
    cerr << "message length exceeds buffer size" << endl;
    exit (-1);
}
if (write(wfd, msg, len) < 0){
    EXITONERROR("cwrite");
}
return len;
}

Ошибки, которые я получаю, являются неопределенными ссылочными ошибками. Итак, я предполагаю, что это проблема со ссылками, но я запутался, потому что я включил файл заголовка.

Вот ошибки, которые я получаю:

client.cpp:(.text+0xc8): undefined reference to 
`FIFORequestChannel::FIFORequestChannel(std::__cxx11::basic_string<char, std::char_traits<char>, 
 std::allocator<char> >, FIFORequestChannel::Side)'
 client.cpp:(.text+0x22e): undefined reference to `FIFORequestChannel::cwrite(void*, int)'
 client.cpp:(.text+0x242): undefined reference to `FIFORequestChannel::cread(int*)'
 client.cpp:(.text+0x2f3): undefined reference to `FIFORequestChannel::cwrite(void*, int)'
 client.cpp:(.text+0x307): undefined reference to `FIFORequestChannel::cread(int*)'
 client.cpp:(.text+0x446): undefined reference to `FIFORequestChannel::cwrite(void*, int)'
 client.cpp:(.text+0x45a): undefined reference to `FIFORequestChannel::cread(int*)'
 client.cpp:(.text+0x489): undefined reference to `FIFORequestChannel::cwrite(void*, int)'
 client.cpp:(.text+0x4b6): undefined reference to `FIFORequestChannel::~FIFORequestChannel()'
 client.cpp:(.text+0x54d): undefined reference to `FIFORequestChannel::~FIFORequestChannel()'
 collect2: error: ld returned 1 exit status

Я использую Cloud9 IDE на Amazon Webservices, и все файлы находятся в одной папке.

1 Ответ

0 голосов
/ 06 октября 2019

Я в замешательстве, потому что я обязательно включил заголовочный файл.

Использование #include "FIFOreqchannel.h" является необходимым , но не достаточным для связи вашей программы. Вы должны также предоставить FIFOreqchannel.o компоновщику .

Вы делаете что-то вроде:

g++ client.cpp

Вы должны сделать:

g++ client.cpp FIFOreqchannel.cpp  ...other_object_files... ...other_libraries...
...