Я не могу скомпилировать этот пример примера веб-сервера mongoose
Краткое введение:- (GCC версии 4.6.3, OS-Ubuntu 12.04, работающая вокруг программы веб-сервера mongoose, поэтому, когда я запускаю команду "make" для компиляции и установки mongoose, она отлично справилась с задачей).
[Часть 1 вопроса] Этот вопрос относится к этому сообщению о stackowerflow.
веб-сервер mongoose программа helloworld
Валенок ответил на этот пост, дав ссылку на пример программы.
в основном, я пытаюсь скомпилировать пример программного кода, приведенного по этой ссылке: -
http://code.google.com/p/mongoose/source/browse/examples/hello.c
и поместите этот код в уже скомпилированный каталог mongoose.(в каталоге есть файл mongoose.h)
Ниже приведен вывод командной строки для моей компиляции привет программы.
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:~$
[Часть 2 вопроса]
Теперь я нахожу реализации mg_stop, mg_start,mg_printf и mg_get_request_info в файле mongoose.c, поэтому я компилирую файл mongoose.c с параметром -c как: gcc -c -o mongoose.o mongoose.c
Я думаю, что мой вопрос похож на: -
неопределенная ссылка на функцию, объявленную в файле *.h
но затем, когда я связываю libmongoose.so с опцией -L на gcc, я получаю следующие ошибки:- (libmongoose.so присутствует в той же директории, мой 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
Кроме того, я продолжаю получать ошибки выше ^^ при компиляции без использования libmongoose.so
[EDIT]: добавлена опция -pthread на gcc, все еще отображаются ошибки:-
mongoose.o: в функции load_dll':
mongoose.c:(.text+0xa955): undefined reference to
dlopen'
mongoose.c:(.text+0xa9b4): неопределенная ссылка на `dlsym'
collect2: ld вернул 1 состояние выхода
Для части 1 и части 2 моего вопроса: я хочу избавиться от этих ошибок и успешно запустить пример программы hello.c. Заранее спасибо.
1 ответ
-L
опция не используется для связи с библиотекой, она используется для указания пути поиска для динамических библиотек. Чтобы связать с определенной библиотекой, используйте -l
, Тем не менее, вам не нужно связывать оба mongoose.o
а также libmongoose.so
либо одного достаточно.
В Linux вы также должны ссылаться на pthread и библиотеку динамической загрузки, потому что, несмотря на то, что они являются частью стандартной библиотеки C, их нет в libc.so
, Еще одна вещь, на которую следует обратить внимание, это то, что последние версии binutils (в частности, ld
) требуют, чтобы библиотеки и объектные файлы были указаны в том порядке, в котором символы зависят друг от друга, т.е. библиотеки должны идти до конца командной строки.
В общем, используйте одну из следующих команд:
gcc -o hello hello.o mongoose.o -ldl -lpthread
или же
gcc -L. -o hello hello.o -lmongoose -ldl -lpthread