2017-01-10 4 views
1

J'ai essayé de compiler un code très simple qui contient postgres, pthread et mutexes. maintenant quand je le fais avec pthread seul tout va bien, même quand je le fais avec postgress seul! mais quand j'essaye de compiler le code complet je cours dans des problèmes stupides!comment compiler le code C avec pthread et lpq

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

je reçois:

/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 

quand je lance:

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

Je reçois:

/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 

le plus proche chose que j'ai une compilation a été (en termes du nombre d'erreurs):

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

qui se traduit par:

/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 

je ne sais pas si ça aide, mais voici la même commande avec -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 

pas de chance jusqu'à présent :(-ce que tout le corps sait ce qui ne va pas ici?

ici est une version simplifiée du code de mon:

#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; 
} 

Répondre

1

Ce code a échoué à construire en l'état pour moi, en raison d'erreurs telles que:

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 

Je résolus qu'en réduisant la pile de quelques ordres de grandeur. Vos erreurs d'éditeur de lien pourraient être liées, car je n'ai eu aucun problème à lier l'exemple après avoir fait ce changement.

Vous devez compiler votre code avec -Wall. Il y a plusieurs bogues critiques, comme une fonction non-vide qui ne retourne pas de valeur, utilisée comme entrée dans pthread_create.

+0

merci :) Je n'ai pas pensé à cela:/c'est un programme d'analyse de texte lourd, c'est pourquoi j'avais besoin de ces énormes tableaux .. maintenant je les ai coupés et il compile :) Je les coupais ou travailler avec la taille de tas plus tard pensez-vous que la taille de tas fonctionnerait? aussi j'ai corrigé le truc de retour :) merci encore. –

+0

Je suggère d'étudier l'indicateur de compilateur gcc '-mcmodel'. L'allocation de la mémoire au moment de l'exécution peut également fonctionner. – parzival