如何使用 pthread 和 lpq 编译 C 代码
how to compile C code with pthread and lpq
我一直在尝试编译一个非常简单的代码,其中包含 postgres、pthread 和 mutexes。现在,当我单独使用 pthread 时,一切都很好,当我单独使用 postgress 时也是如此!但是当我尝试编译完整的代码时,我 运行 遇到了愚蠢的问题!
gcc -o pleaseWork uploadData.c -I/usr/include/postgresql -lpthread -lpq
我得到:
/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
当我 运行 :
gcc -o omido -I/usr/include/postgresql -lpq -lpthread uploadData.c
我得到:
/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
我得到的最接近编译的是(就错误数量而言):
gcc -o pleaseWork -I/usr/include/postgresql -pthread -lpthread -lpq uploadData.c
结果是:
/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
我不知道它是否有帮助,但这是与 -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
到目前为止运气不好:(有人知道这里出了什么问题吗?
这是我的代码的简化版本:
#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;
}
由于以下错误,此代码无法按原样构建:
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
我通过将堆栈数组减少几个数量级来解决这个问题。您的链接器错误可能是相关的,因为在进行更改后我可以毫无问题地链接示例。
您应该使用 -Wall 编译您的代码。有几个严重的错误,例如没有 return 值的非空函数被用作 pthread_create.
的输入
第一个错误:
因为它会招致测试,所以我只指出立即出现在我脑海中的想法。我查看了头文件并识别出“联合”的“typedef”。因此,您必须提供该联合的正确类型。为了锁定所有互斥量,您必须指向任何有效数据。
第二个错误:
必须提供“-lpq”。它指向库函数的地址。因此重装开发库应该可以解决。
测试:
gcc -o pleaseWork uploadData.c -lpthread -lpq
我目前正在尝试通过类似的命令来编译我的示例。它成功了。因此,这似乎是一个安装任务。
我一直在尝试编译一个非常简单的代码,其中包含 postgres、pthread 和 mutexes。现在,当我单独使用 pthread 时,一切都很好,当我单独使用 postgress 时也是如此!但是当我尝试编译完整的代码时,我 运行 遇到了愚蠢的问题!
gcc -o pleaseWork uploadData.c -I/usr/include/postgresql -lpthread -lpq
我得到:
/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
当我 运行 :
gcc -o omido -I/usr/include/postgresql -lpq -lpthread uploadData.c
我得到:
/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
我得到的最接近编译的是(就错误数量而言):
gcc -o pleaseWork -I/usr/include/postgresql -pthread -lpthread -lpq uploadData.c
结果是:
/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
我不知道它是否有帮助,但这是与 -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
到目前为止运气不好:(有人知道这里出了什么问题吗?
这是我的代码的简化版本:
#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;
}
由于以下错误,此代码无法按原样构建:
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
我通过将堆栈数组减少几个数量级来解决这个问题。您的链接器错误可能是相关的,因为在进行更改后我可以毫无问题地链接示例。
您应该使用 -Wall 编译您的代码。有几个严重的错误,例如没有 return 值的非空函数被用作 pthread_create.
的输入第一个错误:
因为它会招致测试,所以我只指出立即出现在我脑海中的想法。我查看了头文件并识别出“联合”的“typedef”。因此,您必须提供该联合的正确类型。为了锁定所有互斥量,您必须指向任何有效数据。
第二个错误:
必须提供“-lpq”。它指向库函数的地址。因此重装开发库应该可以解决。
测试:
gcc -o pleaseWork uploadData.c -lpthread -lpq
我目前正在尝试通过类似的命令来编译我的示例。它成功了。因此,这似乎是一个安装任务。