The OpenNET Project / Index page

[ новости /+++ | форум | теги | ]

форумы  помощь  поиск  регистрация  майллист  вход/выход  слежка  RSS
"C++ FastCGI  Не могу скомпилировать..."
Вариант для распечатки  
Пред. тема | След. тема 
Форумы Программирование под UNIX (Public)
Изначальное сообщение [Проследить за развитием треда]

"C++ FastCGI  Не могу скомпилировать..."  
Сообщение от Wild Falcon email on 04-Окт-07, 16:34 
Собственно проблема:
Птіаюсь скомпилировать пример из СДК по фастцги.
Программа:
--------------------------

      #include "fcgi_stdio.h"
      #include <stdlib.h>
      
      int main(void)
      {
      int count = 0;
      while(FCGI_Accept() >= 0)
      printf("Content-type: text/html\r\n"
      "\r\n"
      "<title>FastCGI Hello!</title>"
      "<h1>FastCGI Hello!</h1>"
      "Request number %d running on host <i>%s</i>\n",
      ++count, getenv("SERVER_NAME"));
      return 0;
}

----------------------------

и консоль компиляции:

---------------------------

      %g++ -I/usr/local/include -L/usr/local/lib/fcgilib.a fcgi.cpp -o fcgihw.cgi -lm -static -lz -Wno-deprecated
      
      fcgi.cpp:15:2: warning: no newline at end of file
      /var/tmp//ccmQO6Lx.o(.text+0x24): In function `main':
      : undefined reference to `FCGI_Accept'
      /var/tmp//ccmQO6Lx.o(.text+0x4e): In function `main':
      : undefined reference to `FCGI_printf'

---------------------------

Что делать? В чем ошибка?

Высказать мнение | Ответить | Правка | Наверх | Cообщить модератору

 Оглавление

Сообщения по теме [Сортировка по времени | RSS]


1. "C++ FastCGI  Не могу скомпилировать..."  
Сообщение от anonymous (??) on 04-Окт-07, 17:56 
> -L/usr/local/lib/fcgilib.a

Параметр -L указывает каталог для поиска библиотек.  Параметр -l указывает саму библиотеку.  Так что приблизительно так:

-L/usr/local/lib -lfcgilib
или
-l/usr/local/lib/fcgilib.a

Высказать мнение | Ответить | Правка | Наверх | Cообщить модератору

2. "C++ FastCGI  Не могу скомпилировать..."  
Сообщение от Wild Falcon email on 04-Окт-07, 18:16 
>> -L/usr/local/lib/fcgilib.a
>
>Параметр -L указывает каталог для поиска библиотек.  Параметр -l указывает саму
>библиотеку.  Так что приблизительно так:
>
>-L/usr/local/lib -lfcgilib
>или
>-l/usr/local/lib/fcgilib.a

Да то же самое :(


В любом варианте - или с указанием только каталога, или с указанным файлом библиотеки.
Упростил пример:

Код:
-----------------------
#include <fcgi_stdio.h>
#include <stdlib.h>

int main(void)
{
    printf("Hello");
    return 0;
}

-----------------------

Консоль:

------------------------
%g++ -I/usr/local/include -L/usr/local/lib fcgi.cpp -o fcgihw.cgi
/var/tmp//ccaMuRaD.o(.text+0x2c): In function `main':
: undefined reference to `FCGI_printf'
------------------------

Высказать мнение | Ответить | Правка | Наверх | Cообщить модератору

3. "C++ FastCGI  Не могу скомпилировать..."  
Сообщение от vic (??) on 04-Окт-07, 18:53 
>>> -L/usr/local/lib/fcgilib.a

должно быть libfcgi.a, а не fcgilib.a

>>Параметр -L указывает каталог для поиска библиотек.  Параметр -l указывает саму
>>библиотеку.  Так что приблизительно так:
>>
>>-L/usr/local/lib -lfcgilib
>>или
>>-l/usr/local/lib/fcgilib.a

с учетом вышесказанного:
-L/usr/local/lib -lfcgi

>#include <fcgi_stdio.h>
>#include <stdlib.h>
>
>int main(void)
>{
> printf("Hello");
> return 0;
>}
>%g++ -I/usr/local/include -L/usr/local/lib fcgi.cpp -o fcgihw.cgi

Компилите вы как C++, а пишите на С. Неправильно это, определитесь какой язык используете.
Тем более в данном SDK присутствуют две либы: libfcgi и libfcgi++

1. main:
int main() - С++
int main(void) - C

2. g++ -Wall -I/usr/local/include -L/usr/local/lib -lfcgi fcgi.cpp -o fcgihw.cgi

Высказать мнение | Ответить | Правка | Наверх | Cообщить модератору

4. "C++ FastCGI  Не могу скомпилировать..."  
Сообщение от vic (??) on 04-Окт-07, 18:57 
ЗЫ:

в предыдущем посте подразумевается что установка была по стандартному way (если из исходников):

./configure --prefix=/usr/local
make
make install

Высказать мнение | Ответить | Правка | Наверх | Cообщить модератору

5. "C++ FastCGI  Не могу скомпилировать..."  
Сообщение от Wild Falcon email on 04-Окт-07, 19:44 
>ЗЫ:
>
>в предыдущем посте подразумевается что установка была по стандартному way (если из
>исходников):
>
>./configure --prefix=/usr/local
>make
>make install

Да, ставилось все из стандартных исходников из СДК

Это я тестирую компиляцию, программа потом будет писатся на С++ с использованиемм классов и возможностей ООП

Напишите пожалуйста какие библиотеки и как подключать для этого случая.

Высказать мнение | Ответить | Правка | Наверх | Cообщить модератору

6. "C++ FastCGI  Не могу скомпилировать..."  
Сообщение от vic (??) on 05-Окт-07, 12:15 
>Напишите пожалуйста какие библиотеки и как подключать для этого случая.

-L/usr/local/lib -lfcgi++

Высказать мнение | Ответить | Правка | Наверх | Cообщить модератору

7. "C++ FastCGI  Не могу скомпилировать..."  
Сообщение от Wild Falcon email on 05-Окт-07, 15:46 
>>Напишите пожалуйста какие библиотеки и как подключать для этого случая.
>
>-L/usr/local/lib -lfcgi++

Тогда еще один вопрос...

Эта строка:

-L/usr/local/lib -lfcgi++

-L/usr/local/lib -это каталог с библиотеками...

а вот -lfcgi++ -откуда это взялось? Там ведь библиотеки называются libfcgi.a ; libfcgi++.a

Высказать мнение | Ответить | Правка | Наверх | Cообщить модератору

8. "C++ FastCGI  Не могу скомпилировать..."  
Сообщение от vic (??) on 05-Окт-07, 16:23 
>Эта строка:
>
>-L/usr/local/lib -lfcgi++
>
>-L/usr/local/lib -это каталог с библиотеками...

Верно.

>а вот -lfcgi++ -откуда это взялось? Там ведь библиотеки называются libfcgi.a ;
>libfcgi++.a

Shared library принято именовать с префиксом 'lib', префикс при указании линковщику с ключем -l убирается, так же как и постфикс '.so'. Т.е. libfcgi++.so превращается в fcgi++ ну и ключ -l, в итоге -lfcgi++. Ну а путь -L/usr/local/lib указывает где искать библиотеку.

Высказать мнение | Ответить | Правка | Наверх | Cообщить модератору

9. "C++ FastCGI  Не могу скомпилировать..."  
Сообщение от glass (??) on 13-Окт-07, 14:23 
У меня тоже не получается откомпилировать:
/tmp/.private/vic/ccV0qRQb.o: In function `main':
polynomial.cpp:(.text+0x37a): undefined reference to `FCGI_Accept'
collect2: выполнение ld завершилось с кодом возврата 1

Компилирую так:
g++ -o ../cgi-bin/polynomial -I. -L/usr/lib -lfcgi++  polynomial.cpp

#include <fcgi_stdio.h>
#include <cstdlib>
#include <iostream>
#include <table.h>
#include <variants.h>
using namespace std;

int main() {
  char charset[]="iso-8859-1";
  int count=0;

  while (FCGI_Accept() >= 0)   {
    printf("Content-type: text/html; charset=%s\r\n"
      "\r\n"
      "<title>FastCGI Hello! (C, fcgi_stdio library)</title>"
      "<h1>FastCGI Hello! (C, fcgi_stdio library)</h1>"
      "Request number %d running on host <i>%s</i>\n",
      charset, ++count, getenv("SERVER_HOSTNAME"));
  }
  return 0;

}

Помогите пожалуйста разобраться в чем проблема.

Высказать мнение | Ответить | Правка | Наверх | Cообщить модератору

10. "C++ FastCGI  Не могу скомпилировать..."  
Сообщение от vic (??) on 15-Окт-07, 14:58 
>У меня тоже не получается откомпилировать:
>/tmp/.private/vic/ccV0qRQb.o: In function `main':
>polynomial.cpp:(.text+0x37a): undefined reference to `FCGI_Accept'
>collect2: выполнение ld завершилось с кодом возврата 1
>
>Компилирую так:
>g++ -o ../cgi-bin/polynomial -I. -L/usr/lib -lfcgi++  polynomial.cpp
>

1. Установлено в /usr/local или /usr ? Если в /usr/local то вместо -L/usr/lib должно быть -L/usr/local/lib
2. Флаг компилятора -Wall д.б. в обязательном порядке использоваться.
3. Сразу вопрос про язык, С или С++ ? см ниже.


>#include <fcgi_stdio.h>
>#include <cstdlib>
>#include <iostream>
>#include <table.h>
>#include <variants.h>
>using namespace std;

1. плохой стиль ведет к конфликтам не используйте using namespace глобально. Используйте префиксы std:: для элементов из namespace.
2. половина include явно либо лишние, либо неправильные.

>int main() {
>  char charset[]="iso-8859-1";

1. const char* charset = "iso-8859-1"; // это ж константа в вашем примере, а не изменяемый массив.
2. const std::string charset("iso-8859-1"); // мы же на с++ пишем?


>  int count=0;
>
>  while (FCGI_Accept() >= 0)   {

Это С-ные, а не С++ функции т.е. необходимо использовать -lfcgi вместо -lfcgi++
Если все же хотим C++ смотрите .h файл и доку на предмет c++ объектов из fcgi++.

>    printf("Content-type: text/html; charset=%s\r\n"
>      "\r\n"
>      "<title>FastCGI Hello! (C, fcgi_stdio library)</title>"
>      "<h1>FastCGI Hello! (C, fcgi_stdio library)</h1>"
>      "Request number %d running on host <i>%s</i>\n",
>      charset, ++count, getenv("SERVER_HOSTNAME"));

1. Неопределенное поведение при возврате NULL из функции getenv("SERVER_HOSTNAME"). На некоторых осях, printf с NULL упадет в coredump.
2. printf - это С, а не С++. В С++ используются потоки.

Высказать мнение | Ответить | Правка | Наверх | Cообщить модератору

Архив | Удалить

Индекс форумов | Темы | Пред. тема | След. тема
Оцените тред (1=ужас, 5=супер)? [ 1 | 2 | 3 | 4 | 5 ] [Рекомендовать для помещения в FAQ]




Партнёры:
PostgresPro
Inferno Solutions
Hosting by Hoster.ru
Хостинг:

Закладки на сайте
Проследить за страницей
Created 1996-2025 by Maxim Chirkov
Добавить, Поддержать, Вебмастеру