问题
Given this code :
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sys/wait.h>
#include <unistd.h>
#include <fcntl.h>
#include <sys/stat.h>
#include <sys/types.h>
#include <sys/shm.h>
#include <semaphore.h>
#include <pthread.h>
#define BUF_SIZE 256
int main()
{
key_t key;
char *virtualaddr;
sem_t *get, *put;
int shmid;
const char* messageOne = "Hello world , I'm child number 1\n";
const char* messageTwo = "Hello world , I'm child number 2\n";
char buf[BUF_SIZE];
key = ftok("anyfile",'R');
shmid = shmget(key,1024,0644|IPC_CREAT);
...
...
shmctl (shmid, IPC_RMID, NULL);
exit(EXIT_SUCCESS);
}
I get from eclipse undefined reference to sem_open .
I've check with this post since this question is very similar to mine , but didn't understand exactly where is my mistake ,
Can you please explain where do I need to fix it / add another compilation command (if this is indeed the case) ?
Much appreciated
回答1:
You need to include -lpthread when compiling. This is used by the linker, to link your binary against the library.
The other answers already cover how to do this on the command line.
To do this in Eclipse, you need to follow the directions here:
In the project properties, go to : C/C++ Build --> Settings. Then "Tool Settings", select "Libraries" under "Linker". You can add all your project libraries there (without the "-l"). Also in the lower part, you can add custom path to search libraries
回答2:
When linking, you have to add the flag -pthread or -lrt to the command line. It's right there in the manual page.
回答3:
As it is written in the first answer in the question you linked, you nedd to compile it in this way:
gcc source.c -lpthread
-lrt or -pthread will do the same.
来源:https://stackoverflow.com/questions/11500879/sem-open-doesnt-work-with-ubuntu-undefined-reference-to-sem-open