Skip to main content

few program needs to link required library in gcc

lets consider simple program below
this program will compile but linker fails to find definition of cos and sin functions

#include<stdio.h>
#include<math.h>
#include <stdlib.h>
#define PI 3.142
int main()
{
 double sinval, cosval;
 int x=2;

 sinval = sin(PI/x);
 cosval = cos(PI/x);
 printf("sin and cos of PI/x  is %lf %lf\n", sinval, cosval);
 return 0;

}
followings link errors we will hit, since linker can't able to resolve the definition of cos() and sin()

shiv@ubuntu:~$ gcc mat1.c
/tmp/ccHOvWsZ.o: In function `main':
mat1.c:(.text+0x2a): undefined reference to `sin'
mat1.c:(.text+0x4b): undefined reference to `cos'
collect2: ld returned 1 exit status

so to fix the above issue we need to link the required library, here cos() and sin() are present in the math library so we need to link math library with the program as follows
gcc  mat1.c -lm

-lm will link the math library with above program so program build properly, so as like this gcc has few other library needs to link(but not limited to) are  posix threads (-lpthread), pipes (-pipe),   please check documentation for details




Comments

Popular posts from this blog

C Program to Simulate Linux Cat command

/*  * C program to Simulate Implementation of  Linux *cat* command  * This program will not handle redirection  * you can try to improve this program to handle redirection of file contents  */ #include<stdio.h> #include<string.h> #define MAX_FILE_NAME_CHARS 255 int main(int argc, char *argv[]) {  FILE *fp;  char file_name[MAX_FILE_NAME_CHARS], ch;  int i;  /*   * after creating a.out, rename it as mycat for our own cat command   * and it usage is same as standard cat command   */  if(argc<1){     printf("Usage mycat <filename> \n");     return 0;  }  /*   * cat handles more than one file   * so we need this loop to handle all the files provided   * on command line   */  for(i=1; i<=argc;i++){     /* no need of copy but for understanding purpose, i have created      * string for each file name      */     strncpy(file_name, argv[i], MAX_FILE_NAME_CHARS);     fp=fopen(file_name, "r");     if(fp == NULL) {   

simple program to create Orphan process

shiv@ubuntu:~/ds/unix$ cat  orp.c /*  * Program to create orphan process @ Linux  * getpid() gives process PID and   * getppid() gives process's parent ID   * here main() process ID is parent id is current shells PID  * once process becomes orphan it is adopted by init process(it's PID is 1)  */   #include<stdio.h> #include<unistd.h> int main() {  pid_t p; /* create child process */  p=fork();  if(p==0) {     /* fork() returns Zero to child */     sleep(10);  }  printf("The child process pid is %d parent pid %d\n", getpid(), getppid()); /*parent/child waits for 20 secs and exits*/  sleep(20);  printf("\nProcess %d is done its Parent pid %d...\n", getpid(), getppid());  return 0; } O/p shiv@ubuntu:~/ds/unix$ ./a.out The child process pid is 2575 parent pid 1922 The child process pid is 2576 parent pid 2575 Process 2575 is done its Parent pid 1922... shiv@ubuntu:~/ds/unix$ Process 2576 is done its Parent pid 1...

Interactive C program to implement stack using doubly linked list

shiv@ubuntu:~/ds/stack$ cat stack.c /*  * Copy right by Shiv Yaragatti  * you are free to use, modify  and redistribute code on own risk  * Interactive C Program to implement STACK using Doubly linked list  */ #include "header.h" struct stack { int data; struct stack *next; struct stack *prev; }; typedef struct stack *S; /*Push elements in to stack */ void push(S *stack) {   int e;   S temp;   temp=malloc(sizeof(struct stack));   if(!temp){      printf("Can't allocate memory\n");      return;  }  printf("Enter element to push\n");  scanf("%d", &e);  temp->data=e;  if(*stack == NULL){     temp->next = temp->prev = NULL;     *stack=temp;  } else {    temp->next = *stack;    (*stack)->prev = temp;    temp->prev = NULL;    *stack=temp;  } } /* Display elements in the stack */ void display(S s){    S temp;    temp=s;    printf("Elements are ...\n");    while(temp) {     printf("%d\n", temp->data