-1

test.cppファイルを使用してライブラリをコンパイルしようとしていますが、

私は必要なすべてのインクルードを取得しますが、それでも取得します:

test.cpp:(.text+0x24): undefined reference to `initdevice(char*)'
test.cpp:(.text+0x4c): undefined reference to `write2device(char*, int)'
test.cpp:(.text+0x68): undefined reference to `closedevice()'
test.cpp:(.text+0x79): undefined reference to `write2device(char*, int)'
collect2: ld returned 1 exit status

主な機能:

#include <fstream>
#include <iostream>
#include <stdio.h>
#include <setjmp.h>
#include <signal.h>
#include <string.h>
#include <unistd.h>
#include <sys/time.h>
#include <limits.h>
#include <set>
#include <map>
#include <stdlib.h>
#include <assert.h>
#include <pthread.h>
#include "writerThread.h"
#include "outputdevice.h"
using namespace std;

int writeToFile();

#define FILE_NAME   "/cs/stud/elishae/Documents/elisha.txt"

int main()
{
int status, id;

char *buf = (char *) malloc(10);
buf = "elishaefla";




//writeToFile();

status = initdevice("testFile.txt");

printf("status = %d\n", status);

id = write2device(buf, 10);

printf("id = %d\n", id);

closedevice();

id = write2device(buf, 10);

//printf("id = %d\n", id);

}

必要な機能を保持するファイル:

#include <fstream>
#include <iostream>
#include <stdio.h>
#include <setjmp.h>
#include <signal.h>
#include <string.h>
#include <unistd.h>
#include <sys/time.h>
#include <limits.h>
#include <set>
#include <map>
#include <stdlib.h>
#include <assert.h>
#include <pthread.h>
#include "writerThread.h"
using namespace std;

vector<TaskInfo *> taskQueue;

pthread_t writerThread;

pthread_mutex_t taskQueueMutex, condMutuex;

pthread_cond_t newTasksCond;

bool keepRunning;

int gMaxId;

int initdevice(char *filename)
{

int status;


keepRunning = true;



status = initWriterTrhead(&taskQueue, filename, &newTasksCond, &keepRunning);


status = pthread_mutex_init(&taskQueueMutex, NULL);

status = pthread_cond_init(&newTasksCond, NULL);

status = pthread_create(&writerThread, NULL, writerThreadMain, (void *) 1);

return status;
}


int write2device(char *buffer, int length)
{

/*
 * flow: 1) get mutux for taskMap.
 *       2) iterate over map, find lowest ID open to use - either free entry, or entry with wasItWritten == true.
 *       3) write buffer to map.
 *       4) return.
 */

unsigned int i;
TaskInfo *newTask, *taskTemp;
bool emptyEntryFound = false;

char *bufferCopy = (char *) malloc(length);

memcpy(bufferCopy, buffer, length);

newTask = (TaskInfo *) malloc(2*sizeof(int) + sizeof(bool) + length);
newTask->length = length;
newTask->buffer = bufferCopy;
newTask->wasItWritten = false;


pthread_mutex_lock(&taskQueueMutex);
// insert new task to taskMap TODO: check this code... really not sure it's working
for(i = 0; i < taskQueue.size(); i++)
{
    taskTemp = taskQueue.at(i);

    if(NULL == taskTemp)
    {
        printf("ERROR!!! write2device()\n");
        exit(-1);
    }
    if(taskTemp->wasItWritten == true)
    {
        taskTemp = newTask;
        emptyEntryFound = true;
        break;
    }

}

if(false == emptyEntryFound)
{
    // no empty entries on taskQueue, so we'll insert a new entry
    taskQueue.push_back(newTask);

}

newTask->taskId = i;

pthread_mutex_unlock(&taskQueueMutex);

// signal to writerThread new task was inserted to taskQueue
pthread_cond_signal(&newTasksCond);

printf("vector size = %d\n", taskQueue.size());


return newTask->taskId;
}

Makefile:

.SUFFIXES:      .o .cpp

.cpp.o :
        g++  -Wall -c -o $@ $<


all:    liboutputdevice.a

# remove the old tapestry library and remake the new one
liboutputdevice.a:  outputdevice.o writerThread.o 
        rm -f $@
        ar rc $@ outputdevice.o writerThread.o

# cleaning all created files    
clean:
        rm -f *.o liboutputdevice.a

libをビルドした後。makeで、これは私が次にやろうとしていることです。

私がすべて一緒にコンパイルしようとしている方法:

g++ -Wall -lpthread liboutputdevice.a test.cpp

なぜこのエラーが発生するのですか?

4

3 に答える 3

1

ライブラリを最後に配置します。

g ++ -Wall -pthread test.cpp liboutputdevice.a

-pthread代わりに使用します-lpthreadgcc-コンパイル時の-pthreadフラグの重要性を参照)。

于 2012-05-15T13:33:45.540 に答える
1

リンクラインに追加-loutputdeviceします。

g++ -Wall test.cpp -lpthread -loutputdevice

-Lライブラリが現在のディレクトリにない場合は、これも必要になる場合があります)。

于 2012-05-15T13:33:48.110 に答える
0

それを試してください:g ++ -Wall -lpthread -Llibrarypath / liboutputdevice.a test.cpp

于 2012-05-15T13:35:43.870 に答える