how to compile C code with pthread and lpq

610 views Asked by At

I have been trying to compile a very simple code that contains postgres, pthread and mutexes. now when I do it with pthread alone every thing is fine, same when I do it with postgress alone! but when I try to compile the complete code I'm running into stupid probems!

gcc -o pleaseWork uploadData.c -I/usr/include/postgresql -lpthread -lpq 

I get :

/tmp/ccitU5mG.o: In function `increaseQueryNum':
uploadData.c:(.text+0x5): relocation truncated to fit: R_X86_64_32 against symbol `counterMutex' defined in COMMON section in /tmp/ccitU5mG.o
uploadData.c:(.text+0x21): relocation truncated to fit: R_X86_64_32 against symbol `counterMutex' defined in COMMON section in /tmp/ccitU5mG.o
/tmp/ccitU5mG.o: In function `increaseStackNum':
uploadData.c:(.text+0x31): relocation truncated to fit: R_X86_64_32 against symbol `stackMutex' defined in COMMON section in /tmp/ccitU5mG.o
uploadData.c:(.text+0x4a): relocation truncated to fit: R_X86_64_32 against symbol `stackMutex' defined in COMMON section in /tmp/ccitU5mG.o
/tmp/ccitU5mG.o: In function `decreaseStackNum':
uploadData.c:(.text+0x5a): relocation truncated to fit: R_X86_64_32 against symbol `stackMutex' defined in COMMON section in /tmp/ccitU5mG.o
uploadData.c:(.text+0x73): relocation truncated to fit: R_X86_64_32 against symbol `stackMutex' defined in COMMON section in /tmp/ccitU5mG.o
/tmp/ccitU5mG.o: In function `pop':
uploadData.c:(.text+0xca): relocation truncated to fit: R_X86_64_32 against symbol `stackPopMutex' defined in COMMON section in /tmp/ccitU5mG.o
uploadData.c:(.text+0xf7): relocation truncated to fit: R_X86_64_32 against symbol `stackPopMutex' defined in COMMON section in /tmp/ccitU5mG.o
collect2: error: ld returned 1 exit status

when I run :

gcc -o omido  -I/usr/include/postgresql -lpq  -lpthread uploadData.c

I get :

/tmp/ccdXHrz3.o: In function `main':
uploadData.c:(.text+0x5df): undefined reference to `PQconnectdb'
uploadData.c:(.text+0x5f5): undefined reference to `PQstatus'
uploadData.c:(.text+0x613): undefined reference to `PQfinish'
uploadData.c:(.text+0x68c): undefined reference to `pthread_create'
uploadData.c:(.text+0x6d5): undefined reference to `pthread_create'
uploadData.c:(.text+0x6fe): undefined reference to `pthread_join'
uploadData.c:(.text+0x727): undefined reference to `pthread_join'
collect2: error: ld returned 1 exit status

the closest thing I have got to a compilation was (in terms of number of errors) :

 gcc -o pleaseWork  -I/usr/include/postgresql  -pthread  -lpthread -lpq uploadData.c

which results in :

/tmp/ccg6RbUk.o: In function `main':
uploadData.c:(.text+0x5df): undefined reference to `PQconnectdb'
uploadData.c:(.text+0x5f5): undefined reference to `PQstatus'
uploadData.c:(.text+0x613): undefined reference to `PQfinish'
collect2: error: ld returned 1 exit status

i don't know if it helps but here's the same command with -v:

COLLECT_GCC_OPTIONS='-s' '-o' 'omido' '-I' '/usr/include/postgresql' '-pthread' '-v' '-mtune=generic' '-march=x86-64'
 as -v -I /usr/include/postgresql --64 -o /tmp/ccY3zbjH.o /tmp/ccdK2fuu.s
GNU assembler version 2.24 (x86_64-linux-gnu) using BFD version (GNU Binutils for Ubuntu) 2.24
COMPILER_PATH=/usr/lib/gcc/x86_64-linux-gnu/4.8/:/usr/lib/gcc/x86_64-linux-gnu/4.8/:/usr/lib/gcc/x86_64-linux-gnu/:/usr/lib/gcc/x86_64-linux-gnu/4.8/:/usr/lib/gcc/x86_64-linux-gnu/
LIBRARY_PATH=/usr/lib/gcc/x86_64-linux-gnu/4.8/:/usr/lib/gcc/x86_64-linux-gnu/4.8/../../../x86_64-linux-gnu/:/usr/lib/gcc/x86_64-linux-gnu/4.8/../../../../lib/:/lib/x86_64-linux-gnu/:/lib/../lib/:/usr/lib/x86_64-linux-gnu/:/usr/lib/../lib/:/usr/lib/gcc/x86_64-linux-gnu/4.8/../../../:/lib/:/usr/lib/
COLLECT_GCC_OPTIONS='-s' '-o' 'omido' '-I' '/usr/include/postgresql' '-pthread' '-v' '-mtune=generic' '-march=x86-64'
 /usr/lib/gcc/x86_64-linux-gnu/4.8/collect2 --sysroot=/ --build-id --eh-frame-hdr -m elf_x86_64 --hash-style=gnu --as-needed -dynamic-linker /lib64/ld-linux-x86-64.so.2 -z relro -o omido -s /usr/lib/gcc/x86_64-linux-gnu/4.8/../../../x86_64-linux-gnu/crt1.o /usr/lib/gcc/x86_64-linux-gnu/4.8/../../../x86_64-linux-gnu/crti.o /usr/lib/gcc/x86_64-linux-gnu/4.8/crtbegin.o -L/usr/lib/gcc/x86_64-linux-gnu/4.8 -L/usr/lib/gcc/x86_64-linux-gnu/4.8/../../../x86_64-linux-gnu -L/usr/lib/gcc/x86_64-linux-gnu/4.8/../../../../lib -L/lib/x86_64-linux-gnu -L/lib/../lib -L/usr/lib/x86_64-linux-gnu -L/usr/lib/../lib -L/usr/lib/gcc/x86_64-linux-gnu/4.8/../../.. -lpq -lpthread /tmp/ccY3zbjH.o -lgcc --as-needed -lgcc_s --no-as-needed -lpthread -lc -lgcc --as-needed -lgcc_s --no-as-needed /usr/lib/gcc/x86_64-linux-gnu/4.8/crtend.o /usr/lib/gcc/x86_64-linux-gnu/4.8/../../../x86_64-linux-gnu/crtn.o
/tmp/ccY3zbjH.o: In function `main':
uploadData.c:(.text+0x5df): undefined reference to `PQconnectdb'
uploadData.c:(.text+0x5f5): undefined reference to `PQstatus'
uploadData.c:(.text+0x613): undefined reference to `PQfinish'
collect2: error: ld returned 1 exit status

no luck so far :( does any body know what is wrong here?

here is a simplified version of my code :

#include <pthread.h>
#include <libpq-fe.h>
#include <time.h>
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#include <string.h>
pthread_mutex_t stackWaitMutex;
pthread_mutex_t stackMutex;
pthread_mutex_t counterMutex;  
pthread_mutex_t stackPushMutex;
pthread_mutex_t stackPopMutex;

int done=0;
long queryNum=0;

char *nameStack[500];
char *valueStack[500];
char stack[100000][100000];

int stackCounter=0;

void increaseQueryNum(){
    pthread_mutex_lock(&counterMutex);
    queryNum++;
    pthread_mutex_unlock(&counterMutex);
}


void increaseStackNum(){
        pthread_mutex_lock(&stackMutex);
        stackCounter++;
        pthread_mutex_unlock(&stackMutex);
}
void decreaseStackNum(){
        pthread_mutex_lock(&stackMutex);
        stackCounter--;
        pthread_mutex_unlock(&stackMutex);
}


void push( int StackNumber, char* item ){


    strcpy(stack[stackCounter ], item);
    increaseStackNum();

}

char* pop ( int StackNumber ){
    char *ret;
    // while(lock)
    //  usleep(2);
    pthread_mutex_lock(&stackPopMutex);

    decreaseStackNum();

    ret = stack[stackCounter];
    // lock=0;
    pthread_mutex_unlock(&stackPopMutex);
    return ret;
}

void *doSeperation  ( void* args ){

    while(1)
    {
        char *p = pop(0);
        if( p==NULL && done ){
            return;
        }

    }   
}

void *reader (void *args){
     int i;

    for( i = 0 ; i <12; i++ ){
        push(1, "test!");
    }
    done=1;
}

int main( int argC , char** argV  ){

    int i;
    PGconn* connection = PQconnectdb("host=XXXXXX dbname=XXXXX  user=postgres password=XXXX");

    if (PQstatus(connection) == CONNECTION_BAD) {
        printf("Connection error\n");
        PQfinish(connection);
        return -1;  
    }
    printf("Connection ok\n");

    int maxThread =5;
    int FilesCount =5;

    pthread_t threads[1000] ;

    pthread_t p2;

    pthread_create(&p2,NULL,reader,&FilesCount);

    usleep(60);

    for( i = 0 ; i < maxThread; i++  ){
        pthread_create(&threads[i],NULL,doSeperation,NULL);
    } 

    pthread_join(p2,NULL);

    for(  i = 0 ; i < maxThread; i ++ ){
        pthread_join(threads[i],NULL);
    }

    return 0;
}
2

There are 2 answers

2
parzival On BEST ANSWER

This code failed to build as-is for me, due to errors such as:

uploadData.c:25:(.text+0x5): relocation truncated to fit: R_X86_64_32 against symbol `counterMutex' defined in COMMON section in /tmp/ccfzQ53S.o
uploadData.c:27:(.text+0x21): relocation truncated to fit: R_X86_64_32 against symbol `counterMutex' defined in COMMON section in /tmp/ccfzQ53S.o

I solved that by reducing the stack array by a few orders of magnitude. Your linker errors could be related, as I had no trouble linking the example after making that change.

You should compile your code with -Wall. There are several critical bugs, such as a non-void function that doesn't return a value, being used as input to pthread_create.

0
Sebastian Krug On

The first errors:

Since it would incur testing I am only pointing towards ideas that came immediately into my mind. I looked into header files and recognized a "typedef" for an "union". Therefore, you have to provide a proper type of that union. In order to lock all the mutexes you have to point towards any valid data.

Second errors:

"-lpq" must be provided. It points towards addresses of library functions. Therefore reinstallation of the development library should solve it.

Testing:

gcc -o pleaseWork uploadData.c -lpthread -lpq

I was currently trying to compile my examples by means of a similar command. It succeeded. Therefore, it seems to be an installation task.