0

Short Intro :- (GCC version 4.6.3, OS-Ubuntu 12.04 ,working around mongoose web server program so when I run "make" command to compile and install mongoose , it has done the task fine ).

[Part 1 of question] This question is in reference to this post on stackowerflow.

mongoose web server helloworld program

Valenok has answered on this post by giving a link to hello sample program.

basically, I am trying to compile the sample hello program code given on this link :-

http://code.google.com/p/mongoose/source/browse/examples/hello.c

and put this code in already compiled directory of mongoose.(directory has mongoose.h file)

Following is command line output for my compilation of hello program.

akshay@akshay-Inspiron-N5010:~$ gcc mongoose/hello.c -o mongoose/hello
/tmp/ccroC5Z6.o: In function `callback':
hello.c:(.text+0x32): undefined reference to `mg_get_request_info'
hello.c:(.text+0x96): undefined reference to `mg_printf'
/tmp/ccroC5Z6.o: In function `main':
hello.c:(.text+0xee): undefined reference to `mg_start'
hello.c:(.text+0x103): undefined reference to `mg_stop'
collect2: ld returned 1 exit status
akshay@akshay-Inspiron-N5010:~$ 

[Part 2 of question]

Now , I find implementations of mg_stop , mg_start,mg_printf and mg_get_request_info in mongoose.c file , so I compile mongoose.c file with -c option as : gcc -c -o mongoose.o mongoose.c

I think my question is similar to :-

undefined reference to function declared in *.h file

but then when I link libmongoose.so with -L option on gcc I get following errors:- (libmongoose.so is present in same directory ,my cwd)

akshay@akshay-Inspiron-N5010:~/mongoose$ gcc -L libmongoose.so -o hello hello.o mongoose.o
mongoose.o: In function `mg_start_thread':
mongoose.c:(.text+0x1369): undefined reference to `pthread_create'
mongoose.o: In function `load_dll':
mongoose.c:(.text+0xa955): undefined reference to `dlopen'
mongoose.c:(.text+0xa9b4): undefined reference to `dlsym'
collect2: ld returned 1 exit status

also , I continue to get above ^^ errors when I compile without using libmongoose.so

[EDIT] : added -pthread option on gcc, still shows errors :- mongoose.o: In function load_dll': mongoose.c:(.text+0xa955): undefined reference todlopen' mongoose.c:(.text+0xa9b4): undefined reference to `dlsym' collect2: ld returned 1 exit status

For part 1 and part 2 of my question : I want to get rid of these errors and successfully run hello.c program sample successfully. Thanks in advance .

Community
  • 1
  • 1
Akshay Patil
  • 954
  • 1
  • 12
  • 28

1 Answers1

4

The -L option is not used for linking against a library, it's used for specifying a search path for dynamic libraries. To link against a specific library, use -l. However, you don't need to link against both of mongoose.o and libmongoose.so, either one is sufficient.

On Linux, you also have to link against the pthread and the dynamic loading library as well, because despite being part of the C standard library, they're not present in libc.so. One more thing to pay attention to is that recent versions of binutils (specifically, of ld) require that the libraries and object files be specified in the order the symbols depend on each other, i. e. libraries must go to the end of the command line.

All in all, use one of the following commands:

gcc -o hello hello.o mongoose.o -ldl -lpthread

or

gcc -L. -o hello hello.o -lmongoose -ldl -lpthread
  • @H2CO3 Thanks very much! The first command you mentioned works fine. but for second command following error occurred when I run it by ./hello :-- " error while loading shared libraries: libmongoose.so: cannot open shared object file: No such file or directory "" – Akshay Patil Dec 28 '12 at 10:06
  • @AkshayPatil Yes, that's how it works. Please read a bit up on dynamic loading. –  Dec 28 '12 at 10:28