powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / C++ [игнор отключен] [закрыт для гостей] / Модули в Си
25 сообщений из 27, страница 1 из 2
Модули в Си
    #34501859
httt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Здравствуйте.
Как в Си разделить программу на два можуля? В Delphi просто создаются несколько модулей и включаются словом uses.
Нужно разделить функцию коннекта и основную программу (функция коннекта будет использоваться в зазных программах).
Читал про include, но не понял, что нужно прописывать в .h файлах заголовков. Если несложно приведите простенький пример.
...
Рейтинг: 0 / 0
Модули в Си
    #34501921
Akh
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
//1.h

void func();

//1.cpp

void func() {
// реализация
};

//2.cpp
#include "1.h"

int main () {
  func();
  return  0 ;
}

...
Рейтинг: 0 / 0
Модули в Си
    #34502228
httt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Спасибо за ответ, примерно так и делал, но не получается.
cat connect.c:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
#include <string.h>
#include <stdlib.h>
#include "libpq-fe.h"
void con()
{
      char conninfo[ 200 ];
      PGconn *conn;
      sprintf(conninfo,"dbname = clients user=usrer1");
      conn = PQconnectdb(conninfo);
      if (PQstatus(conn) != CONNECTION_OK)
      {
        printf("Connection to database '%s' failed.\n",PQdb(conn));
        printf("%s",PQerrorMessage(conn));
        exit( 1 );
      }
}
cat connect_db.h
Код: plaintext
1.
void con();
Сама программа:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
#include <string.h>
#include "libpq-fe.h"
#include "inc/connect_db.h"

int main()
{
conn();
.....
PQfinish(conn);
return  0 ;
}
Создаю объектный файл:
cc -c -I/usr/local/pgsql/include connect.c
Затем компилирую основную прогу, выдается следующее:
Код: plaintext
1.
/tmp/.private/root/ccyttr9L.o(.text+0x30): In function `main':
prog.c: undefined reference to `con'
collect2: ld returned 1 exit status
make: *** [default] Error 1
...
Рейтинг: 0 / 0
Модули в Си
    #34502272
Akh
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
htttСпасибо за ответ, примерно так и делал, но не получается.
cat connect.c:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
#include <string.h>
#include <stdlib.h>
#include "libpq-fe.h"
 void con()
{
      char conninfo[ 200 ];
      PGconn *conn;
      sprintf(conninfo,"dbname = clients user=usrer1");
      conn = PQconnectdb(conninfo);
      if (PQstatus(conn) != CONNECTION_OK)
      {
        printf("Connection to database '%s' failed.\n",PQdb(conn));
        printf("%s",PQerrorMessage(conn));
        exit( 1 );
      }
}
cat connect_db.h
Код: plaintext
1.
 void con();
Сама программа:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
#include <string.h>
#include "libpq-fe.h"
#include "inc/connect_db.h"

int main()
{
 conn();
.....
PQfinish(conn);
return  0 ;
}
Создаю объектный файл:
cc -c -I/usr/local/pgsql/include connect.c
Затем компилирую основную прогу, выдается следующее:
Код: plaintext
1.
/tmp/.private/root/ccyttr9L.o(.text+0x30): In function `main':
prog.c: undefined reference to `con'
collect2: ld returned 1 exit status
make: *** [default] Error 1

Так conn() или con()?

Новый файл в проект не забыл добавить?
...
Рейтинг: 0 / 0
Модули в Си
    #34502310
httt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
con, в последней проге вручную набирал и ошибся. Что значит "добавить новый файл в проект"? Если про инклуде, то
#include "inc/connect_db.h" в основной программе есть. Пробовал и абсолютный путь указывать и в Makefile все прописал вроде.
...
Рейтинг: 0 / 0
Модули в Си
    #34502343
httt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Нужно ли компилировать прогу с функцией con() или достаточно объектного файла?
При компиляции выдается
Код: plaintext
1.
2.
3.
In function `_start':
init.c: undefined reference to `main'
collect2: ld returned  1  exit status
там же нет ф-ии main.
...
Рейтинг: 0 / 0
Модули в Си
    #34502432
Akh
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
htttНужно ли компилировать прогу с функцией con() или достаточно объектного файла?
При компиляции выдается
Код: plaintext
1.
2.
3.
In function `_start':
init.c: undefined reference to `main'
collect2: ld returned  1  exit status
там же нет ф-ии main.

Нужно компилировать cpp файл с этой функцией. Потом он должен линковаться с тоже откомпелированным файлом, содержащим функцию main().
...
Рейтинг: 0 / 0
Модули в Си
    #34502465
maXmo
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
хмм… extern void con(); ?
...
Рейтинг: 0 / 0
Модули в Си
    #34502546
Akh
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
maXmoхмм… extern void con(); ?

Нах?
...
Рейтинг: 0 / 0
Модули в Си
    #34502580
maXmo
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
если функция не экспортируется, оптимизатор вообще может её выкинуть нах.
...
Рейтинг: 0 / 0
Модули в Си
    #34502594
maXmo
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
гнутый может выкинут
...
Рейтинг: 0 / 0
Модули в Си
    #34502660
Akh
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
maXmoесли функция не экспортируется, оптимизатор вообще может её выкинуть нах.

Если, честно - первый раз слышу.
...
Рейтинг: 0 / 0
Модули в Си
    #34502663
Akh
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
maXmoгнутый может выкинут

ни разу еще не обижал. Могу поручаться за 3.3.3
...
Рейтинг: 0 / 0
Модули в Си
    #34502742
maXmo
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
unit-at-a-time появился в 3.4
хотя может чел просто неправильно линкует прогу
...
Рейтинг: 0 / 0
Модули в Си
    #34502765
httt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Напишите, плз, как правильно компилить и линковать в таком случае функцию и основную прогу.
Функцию компилю так:

Код: plaintext
gcc -c -I/usr/local/pgsql/include connect.c -o connect

Прогу командой make с Makefile:
Код: plaintext
1.
2.
3.
4.
CC=gcc -Wall -mcpu=pentium
INC=-I/usr/local/pgsql/include -I/usr/include/cgihtml -I/usr/include/pgsql -I/usr/include/cgihtml
LIBS=-L/usr/local/pgsql/lib -L/usr/lib -I/usr/include/cgihtml -I/usr/include -L /usr/include/cgihtml -lpq -lstdc++ -lcgihtml
default : prog.c
        ${CC} ${INC} ${LIBS} prog.c -o prog -I/usr/include/cgihtml -lcgihtml
Последнее выдает:
Код: plaintext
1.
2.
3.
/tmp/.private/root/ccEi9mtE.o(.text+0xcb): In function `main':
prog.c: undefined reference to `con'
collect2: ld returned  1  exit status
make: *** [default] Error  1 
...
Рейтинг: 0 / 0
Модули в Си
    #34502792
maXmo
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ну и в камом месте ты подрубаешь в прогу ранее скомпиленный connect?
...
Рейтинг: 0 / 0
Модули в Си
    #34502808
maXmo
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
CC=gcc -Wall -mcpu=pentium
INC=-I/usr/local/pgsql/include -I/usr/include/cgihtml -I/usr/include/pgsql
LIBS=-L/usr/local/pgsql/lib -L/usr/lib -I/usr/include/cgihtml -I/usr/include -L /usr/include/cgihtml -lpq -lstdc++ -lcgihtml
default : prog.c connect.o
        ${CC} ${INC} ${LIBS} prog.c -o prog -lcgihtml
connect.o: connect.c
        ${CC} ${INC} -c connect.c -o connect.o
...
Рейтинг: 0 / 0
Модули в Си
    #34502817
maXmo
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ой :)
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
CC=gcc -Wall -mcpu=pentium
INC=-I/usr/local/pgsql/include -I/usr/include/cgihtml -I/usr/include/pgsql
LIBS=-L/usr/local/pgsql/lib -L/usr/lib -I/usr/include/cgihtml -I/usr/include -L /usr/include/cgihtml -lpq -lstdc++ -lcgihtml
default : prog.c connect.o
        ${CC} ${INC} ${LIBS} prog.c -o prog connect.o -lcgihtml
connect.o: connect.c
        ${CC} ${INC} -c connect.c -o connect.o
...
Рейтинг: 0 / 0
Модули в Си
    #34502855
maXmo
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ещё в аргументы заданий следует включить изменяемые хедеры, буде таковые имеются.
...
Рейтинг: 0 / 0
Модули в Си
    #34502873
httt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Всем спасибо за помощь, все работает.
PS: Не могу найти хороших статей или книг по этой теме, может у кого-то есть ссылки?
...
Рейтинг: 0 / 0
Модули в Си
    #34503019
Akh
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
htttВсем спасибо за помощь, все работает.
PS: Не могу найти хороших статей или книг по этой теме, может у кого-то есть ссылки?

Может почитать
Эффективное использование GNU make
...
Рейтинг: 0 / 0
Модули в Си
    #34503073
Akh
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
maXmounit-at-a-time появился в 3.4
хотя может чел просто неправильно линкует прогу

Нашел:

http://saratov.lug.ru/cgi-bin/index.cgi?action=view&id_news=449 20-04-2004 GCC 3.4 [ sinaps ]
Перекомпилированные заголовки, дополнительная оптимизация и улучшенная совместимость с ISO/ANSI C++

GCC 3.4 - крупное обновление одной из базовых частей любого дистрибутива Linux. В числе основных изменений: новая схема компиляции "unit-at-a-time" для языков C, Objective-C, C++ и Java (автоматически включается на уровне -O2 и служит для обнаружения недостижимых функций и переменных, локальных функций и т.п. Обеспечивает общий прирост производительности на уровне 1,3 процента); пересмотренный механизм раскрутки циклов; перекомпилированные заголовки ("precompiled headers", увеличивают скорость компиляции, но имеют кое-какие дефекты в текущей реализации), существенно улучшенная совместимость со стандартом ISO/ANSI C++ и поддержка больших файлов (до 2Гб на 32-битных платформах). Для сборки GCC теперь требуется GNU Make и ISO C90-совместимый компилятор C.

Это оно?

Что за "недостижимые" функции и прочее?
...
Рейтинг: 0 / 0
Модули в Си
    #34503097
maXmo
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
а хз, ну раз всё пашет, значит не нужен экстерн, просто раньше функции, кажется, не экспортировались, если екстерн не указать.
...
Рейтинг: 0 / 0
Модули в Си
    #34503178
Akh
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
maXmoа хз, ну раз всё пашет, значит не нужен экстерн, просто раньше функции, кажется, не экспортировались, если екстерн не указать.

Да, ну, их динозавров. Меня интересует 3.4. Я так понял, что там ввели какой-то unit-at-a-time, который опять по какой-то причине extern требует (какая-то оптимизация). Ты обмолвился, что в курсе этой темы. Вот я и хочу, что бы уточнил этот момент. Если я что-то не правельно понял, то что означаю т эти слова: unit-at-a-time появился в 3.4 ?
...
Рейтинг: 0 / 0
Модули в Си
    #34503247
maXmo
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
я не в курсе, просто знаю, что появилась такая оптимизация, которая может функции выкусывать. Не, если он функцию экспортирует, то не выкусит сто пудов.
...
Рейтинг: 0 / 0
25 сообщений из 27, страница 1 из 2
Форумы / C++ [игнор отключен] [закрыт для гостей] / Модули в Си
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]