user1928596
user1928596

Reputation: 1753

gcc shared library with header in the same library

I'm trying to compile a shared library (.so) with the following code: libreceive.h:

#include <stddef.h>
int receive(int sockfd, void *buf, size_t len, int flags);

libreceive.c

#include <stddef.h>
#include <libreceive/libreceive.h>

int receive(int sockfd, void *buf, size_t len, int flags){
    return recv(sockfd, buf, len, flags);
}

the problem here is that I'm trying to include the .h in the library that I'm building and using it in the same time from the same library in the .c . I know that what I'm trying to do is possible, but I can't manage to do it. How can I do that please.

the code I'm trying is:

gcc -o libreceive.o -c -include libreceive.h libreceive.c

I get the following error:

fatal error: libreceive/libreceive.h: No such file or directory
compilation terminated.

the problem here is that I'm trying to include the .h in the library that I'm building and using it in the same time from the same library in the .c . I know that what I'm trying to do is possible, but I can't manage to do it. How can I do that please.

Upvotes: 0

Views: 1050

Answers (3)

Saurabh Meshram
Saurabh Meshram

Reputation: 8416

You are missing out a few steps here.
Consider the following setup.

File: add.c

#include "header.h"
int add(int a, int b)
{
    printf("SIZE: %d\n", SIZE);
    return a+b;
}

File: sub.c

#include "header.h"
int sub(int a, int b)
{
    printf("SIZE: %d\n", SIZE);
    return a-b;
}

File: header.h, located in directory called include.

#include <stdio.h>
#define SIZE 100
int add(int a, int b);
int sub(int a, int b);

So to step by step build a .so file.

/* Build `.o` files first */
$ gcc -fPIC -c sub.c -I path/to/include/
$ gcc -fPIC -c add.c -I path/to/include/

/* Build shared library called libsample.so */
$ gcc -shared -o libsample.so add.o sub.o

The above command will build a .so by name libsample.so.
Where all definition from .c(like functions) and .h(like #defines) will get included in your library.


How to use this in your code:

Consider the file File: main.c

#include <stdio.h>
int main()
{
    int a = 3, b = 4;
    printf("Return : %d\n", add(a, b));
    return 0;
}

To make use of your library libsample.so.

$ export LD_LIBRARY_PATH=/path/to/direc/containing/.so/file
$ gcc -o exe main.c -lsample -L/path/to/direc/containing/.so/file

The above command should create a binary called exe.

$./exe
SIZE : 100              /* SIZE Defined in .h file */
Return : 7              /* Defined in add.c */

You can refer this guide : http://www.cprogramming.com/tutorial/shared-libraries-linux-gcc.html

Upvotes: 1

user1928596
user1928596

Reputation: 1753

Finaly I decided to use #include "libreceive.h" as suggested by the guys. the probleme I had is that the compiler was looking for my so in /usr/lib wich is the default when id do sudo gcc and my usr had the $LD_LIBRARY_PATH at /usr/local/lib and therefore gcc coudn't find my library at compile time another problem was that the program that call thos .so was looking fro the .h in some folder that doesn't exist and I had to add it. thanks guys for you answers

Upvotes: 0

Wintermute
Wintermute

Reputation: 44023

Since libreceive.h and libreceive.c appear to be in the same directory (judging from your compiler call), the normal way is

#include "libreceive.h"

In order to use

#include <libreceive/libreceive.h>

libreceive.h would have to lie in a directory called libreceive, and that directory would have to be part of the include path. It is possible to achieve this, but I believe it is neither necessary nor useful here.

Upvotes: 1

Related Questions