Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Программирование под Unix/Linux > как создать makefile


Автор: americanets 20.11.2008, 18:53
как создать makefile, руками компилю так

Код

 g++ test.cpp -c
 g++ test2.cpp -c
 g++ test.o test2.o -o test -I/usr/include/mysql -I/usr/include/mysql++ -lmysqlpp -L/usr/lib/mysql -L/usr/local/lib/mysql++  -Icurl/include -lboost_regex `curl-config --libs` -lstdc++ 



но это не удобно , особенно когда файлов становиться больше

Как написать такой makefile , а то что - то не пойму как они пишутся 

Автор: bsa 20.11.2008, 18:59
Ты уверен, что тебе именно это надо? может стоит обратить внимание на automake? Он тебе и configure создаст

Автор: IceSunrise 20.11.2008, 19:01
americanets,  думаю эта небольшая статья вам сильно поможет
http://www.linux.org.ru/books/GNU/Gmake.htm

Автор: sentry 20.11.2008, 19:12
А может, стоит попробовать CMake?

Автор: americanets 21.11.2008, 10:43
IceSunrise, спасибо, читаю , как сделаю напишу что получилось, может что подскажете еще

Автор: americanets 21.11.2008, 10:59
IceSunrise

что - то не так


Код

link_flags   := -I/usr/include/mysql -I/usr/include/mysql++ -lmysqlpp -L/usr/lib/mysql -L/usr/local/lib/mysql++  -Icurl/include -lboost_regex `curl-config --libs` -lstdc++

testmake: main.o main2.o
        g++ main.o main2.o -o testmake

main.o: main.cpp
        g++ -c test.cpp

main2.o: main.cpp
        g++ -c test2.cpp
clean:
        rm *.o


выдает 


Код

 make
Makefile:4: *** пропущен разделитель (не имели ли вы в виду TAB вместо восьми пробелов?).  Останов.



но там не таб ,а  пробелы

Автор: americanets 21.11.2008, 11:54
как раз таб и нужен smile 

но теперь пишет

Код

make: *** Нет правила для сборки цели `main.cpp', требуемой для `main.o'.  Останов.


Автор: americanets 21.11.2008, 12:15
тоже разобрался, но не подключает link_flags 


Код

link_flags   := -I/usr/include/mysql -I/usr/include/mysql++ -lmysqlpp -L/usr/lib/mysql -L/usr/local/lib/mysql++  -Icurl/include -lboost_regex `curl-config --libs` -lstdc++

testmake: main.o
    g++ main.o -o $(link_flags) testparser

test.o: main.cpp
    g++ -c $(link_flags) main.cpp

clean:
    rm *.o




Код

make
g++    -c -o main.o main.cpp
In file included from /usr/include/mysql++/connection.h:38,
                 from /usr/include/mysql++/mysql++.h:56,
                 from main.cpp:5:
/usr/include/mysql++/common.h:124:28: error: mysql_version.h: No such file or directory
/usr/include/mysql++/common.h:182:20: error: mysql.h: No such file or directory
In file included from /usr/include/mysql++/sql_buffer.h:32,
                 from /usr/include/mysql++/stadapter.h:35,
                 from /usr/include/mysql++/qparms.h:35,
                 from /usr/include/mysql++/query.h:34,
                 from /usr/include/mysql++/mysql++.h:58,
                 from main.cpp:5:
/usr/include/mysql++/type_info.h:77: ошибка: expected ‘,’ or ‘...’ before ‘bt’
/usr/include/mysql++/type_info.h:92: ошибка: ‘enum_field_types’ не является именем типа
/usr/include/mysql++/type_info.h: In constructor ‘mysqlpp::mysql_ti_sql_type_info::mysql_ti_sql_type_info()’:
/usr/include/mysql++/type_info.h:71: ошибка: в классе ‘mysqlpp::mysql_ti_sql_type_info’ не имеет поля с именем ‘base_type_’
/usr/include/mysql++/type_info.h:71: ошибка: нет декларации ‘MYSQL_TYPE_NULL’ в этой области видимости
/usr/include/mysql++/type_info.h: In constructor ‘mysqlpp::mysql_ti_sql_type_info::mysql_ti_sql_type_info(const char*, const std::type_info&, int)’:
/usr/include/mysql++/type_info.h:81: ошибка: в классе ‘mysqlpp::mysql_ti_sql_type_info’ не имеет поля с именем ‘base_type_’
/usr/include/mysql++/type_info.h:81: ошибка: нет декларации ‘bt’ в этой области видимости
/usr/include/mysql++/type_info.h:82: ошибка: нет декларации ‘flags’ в этой области видимости
/usr/include/mysql++/type_info.h: At global scope:
/usr/include/mysql++/type_info.h:162: ошибка: expected `)' before ‘t’
/usr/include/mysql++/type_info.h:264: ошибка: ‘enum_field_types’ не является именем типа
/usr/include/mysql++/type_info.h:293: ош

Автор: xvr 21.11.2008, 13:36
Цитата(americanets @ 21.11.2008,  12:15)
тоже разобрался, но не подключает link_flags 


Код

link_flags   := -I/usr/include/mysql -I/usr/include/mysql++ -lmysqlpp -L/usr/lib/mysql -L/usr/local/lib/mysql++  -Icurl/include -lboost_regex `curl-config --libs` -lstdc++

testmake: main.o
    g++ main.o -o $(link_flags) testparser

test.o: main.cpp
    g++ -c $(link_flags) main.cpp

clean:
    rm *.o




Код

make
g++    -c -o main.o main.cpp
In file included from /usr/include/mysql++/connection.h:38,
                 from /usr/include/mysql++/mysql++.h:56,
                 from main.cpp:5:
/usr/include/mysql++/common.h:124:28: error: mysql_version.h: No such file or directory
/usr/include/mysql++/common.h:182:20: error: mysql.h: No such file or directory
In file included from /usr/include/mysql++/sql_buffer.h:32,
                 from /usr/include/mysql++/stadapter.h:35,
                 from /usr/include/mysql++/qparms.h:35,
                 from /usr/include/mysql++/query.h:34,
                 from /usr/include/mysql++/mysql++.h:58,
                 from main.cpp:5:
/usr/include/mysql++/type_info.h:77: ошибка: expected ‘,’ or ‘...’ before ‘bt’
/usr/include/mysql++/type_info.h:92: ошибка: ‘enum_field_types’ не является именем типа
/usr/include/mysql++/type_info.h: In constructor ‘mysqlpp::mysql_ti_sql_type_info::mysql_ti_sql_type_info()’:
/usr/include/mysql++/type_info.h:71: ошибка: в классе ‘mysqlpp::mysql_ti_sql_type_info’ не имеет поля с именем ‘base_type_’
/usr/include/mysql++/type_info.h:71: ошибка: нет декларации ‘MYSQL_TYPE_NULL’ в этой области видимости
/usr/include/mysql++/type_info.h: In constructor ‘mysqlpp::mysql_ti_sql_type_info::mysql_ti_sql_type_info(const char*, const std::type_info&, int)’:
/usr/include/mysql++/type_info.h:81: ошибка: в классе ‘mysqlpp::mysql_ti_sql_type_info’ не имеет поля с именем ‘base_type_’
/usr/include/mysql++/type_info.h:81: ошибка: нет декларации ‘bt’ в этой области видимости
/usr/include/mysql++/type_info.h:82: ошибка: нет декларации ‘flags’ в этой области видимости
/usr/include/mysql++/type_info.h: At global scope:
/usr/include/mysql++/type_info.h:162: ошибка: expected `)' before ‘t’
/usr/include/mysql++/type_info.h:264: ошибка: ‘enum_field_types’ не является именем типа
/usr/include/mysql++/type_info.h:293: ош

Подключается link_flags, иначе у тебя вообще никаких бы include'ов не нашлось. Папка /usr/include/mysql есть? В ней что нибудь лежит?

Кстати, вот это
Код

test.o: main.cpp
    g++ -c $(link_flags) main.cpp
неправильно, должно быть
Код

main.o: main.cpp
    g++ -c $(link_flags) main.cpp

Автор: americanets 21.11.2008, 14:29
xvr, точно, спасибо, так работает


Код

link_flags:= -I/usr/include/mysql -I/usr/include/mysql++ -lmysqlpp -L/usr/lib/mysql -L/usr/local/lib/mysql++  -Icurl/include -lboost_regex `curl-config --libs` -lstdc++

testmake: main.o
    g++ main.o -o testparser $(link_flags)

main.o: main.cpp
    g++ -c main.cpp $(link_flags)

clean:
    rm *.o


только почему - то main.o не удалило

Автор: xvr 21.11.2008, 16:42
Цитата(americanets @ 21.11.2008,  14:29)
xvr, точно, спасибо, так работает


Код

link_flags:= -I/usr/include/mysql -I/usr/include/mysql++ -lmysqlpp -L/usr/lib/mysql -L/usr/local/lib/mysql++  -Icurl/include -lboost_regex `curl-config --libs` -lstdc++

testmake: main.o
    g++ main.o -o testparser $(link_flags)

main.o: main.cpp
    g++ -c main.cpp $(link_flags)

clean:
    rm *.o


только почему - то main.o не удалило

И не должно, напиши make clean - удалит
Кстати, еще одна ошибка:
не
Код

testmake: main.o
    g++ main.o -o testparser $(link_flags)
а
Код

testparser: main.o
    g++ main.o -o testparser $(link_flags)

Автор: americanets 21.11.2008, 17:14
xvr, спасибо

Автор: inside_pointer 24.11.2008, 12:02
пример

Код

 
CC     =  cc
LIB    = -lm
SRC    = main.c
OBJECT = main.o
TARGET = sin

help info:
    @echo "Usage: make { install | clean | help, info }";

install:
    @$(CC) -c $(SRC) -o $(OBJECT);
    @$(CC) $(LIB) $(OBJECT) -o $(TARGET);
    @echo "Usage: ./$(TARGET)";
    
clean:
    @rm -f $(OBJECT) $(TARGET);
    @echo "\"$(TARGET)\" remove...";


быстро удобно один раз написал, потом легко переделывать прогу

Автор: americanets 24.11.2008, 12:10
inside_pointer, спасибо . разбираюсь по тихоньку ,

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)