Временно недоступен
957 / 228 / 14
Регистрация: 12.04.2009
Сообщений: 926
1

[C++] Какие флаги указать линкеру для компиляции программы?

25.10.2009, 19:36. Показов 14307. Ответов 13
Метки нет (Все метки)

Делаю программу,которая использует внешнюю библиотеку SDL. В настройках проекта (работаю в Code::Blocks) указал в опциях линкера Project->Build Options->Linker settings в поле Link libraries путь к файлу /usr/lib/libSDL.so.Всё работает.Дело в том,что у меня в проекте используется Makefile,сделанный вручную,а Code::Blocks собирает автоматом,я даже не знаю как.То есть паралельно с ростом программы приходится править Makefile.Как в этом файле правильно указать флаги или пути к библиотеке?
Makefile выглядит так(Evg делал):
Код
# Принятые обозначения: CC - компилятор Си, CXX - компилятор Си++
CXX = g++
CXXFLAGS = -ansi -pedantic -pedantic-errors -Wall
DFLAGS = -MD
LD = $(CXX)
LDFLAGS =
OFILES = debugger.o error_handler.o value_class.o variable_class.o parser.o  \
         syntax.o expression.o statement.o interp.o memory.o array.o label.o \
         options.o function.o lib.o graphics.o driver.o
RM = rm -f
TARGET = basin

# По умолчанию прика "make" собирает самую первую цель.
# Обычно её обзывают "all" и уже расписывают, что там должно быть
all: $(TARGET)

# Линковка из объектников
$(TARGET): $(OFILES)
	$(LD) $(LDFLAGS) $(OFILES) -o $(TARGET)

# Подключаем файлы зависимостей
# Заумное выражение справа означает взять переменную OFILES и заменить ".o"
# на ".d"  Т.е. здесь по сути написано "-include debugger.d error_handler.d ..."
# Директива include работает точно так же, как и препроцессорная #include
-include $(OFILES:.o=.d)

# Общее правило формирования объектника. $< означает левую часть зависимости,
# $@ - правую
%.o : %.cpp
	$(CXX) -c $(DFLAGS) $(CXXFLAGS) $< -o $@

clean:
	$(RM) $(TARGET) *.o *.d *.bak *~* core
Примерно догадываюсь,что должно быть что-то в секции "LDFLAGS =" вот только что?

P.S. Я уже методом тыка допер,нужно написать LDFLAGS = /usr/lib/libSDL.so ,то есть просто указать путь к библиотеке.
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
25.10.2009, 19:36
Ответы с готовыми решениями:

Как указать линкеру Visual C++ 6.0 два obj-файла?
Пожалуйста помогите. В каталоге bin имеется только файл MSDEV.EXE Получается,что опции...

Какие библиотеки указать для моего дистрибутива..?
В моей программе из спец элементов использ-ся флексгрид иерархический и аксесс, соединение через...

Какие команды в ассемблере не меняют флаги?
Какие команды в ассемблере не меняют флаги? Знаю только некоторые,например пересылка,обмен...

Приложение Qt Quick: какие нужны флаги?
main.cpp #include &lt;QtGui/QApplication&gt; #include &quot;qmlapplicationviewer.h&quot; Q_DECL_EXPORT int...

13
Эксперт С++
7175 / 3234 / 80
Регистрация: 17.06.2009
Сообщений: 14,164
25.10.2009, 20:02 2
А ты запускать-то пробовал ?
Запусти и посмотри работает или нет

"-ansi -pedantic -pedantic-errors" - вот это не нужно
"-MD" - это скорее всего тоже не нужно

"CXXFLAGS = -ansi -pedantic -pedantic-errors -Wall"
Да и вообщем -Wall нужен, но не тут.
Короче Evg какую-то фигню сотворил

Но ты попробуй - если сработает то и так сойдет.
Потом научишься писать файлы
1
Временно недоступен
957 / 228 / 14
Регистрация: 12.04.2009
Сообщений: 926
25.10.2009, 20:08  [ТС] 3
Не,Evg вроде всё правильно сделал,MD это специальный флаг,типа позволяющий разрулить автоматически все .h зависимости и их не надо все писать вручную.
А опции "-ansi -pedantic -pedantic-errors" - это чисто в учебных целях,чтобы все возможные варнинги отлавливались
0
Эксперт С++
7175 / 3234 / 80
Регистрация: 17.06.2009
Сообщений: 14,164
25.10.2009, 20:15 4
Код
# $Id$
CC=gcc
DEBUG_FLAGS=
COPTS=-O2 -pipe
CARCH=
WARN_FLAGS=-Wall
CTARGET=-DTARGET_LINUX
CADDS=
LDFLAGS=
LDADD=
CXX=g++

PROG=xpal
SRCS=src/main.cpp src/xrna.cpp
SRCS+=src/self_path.c
CDEFS=
LDFLAGS+=
LDADD+=-lm

OBJS1=  $(SRCS:.c=.o)
OBJS2=  $(OBJS1:.cpp=.o)
OBJS=   $(OBJS2:.f=.o)

CFLAGS= $(DEBUG_FLAGS) $(COPTS) $(CARCH) $(WARN_FLAGS) $(CDEFS) $(CTARGET) $(CAD
CXXFLAGS= $(CFLAGS)

.c.o:
        $(CC) -c $(CFLAGS) -o $@ $<

.cpp.o:
        $(CXX) -c $(CXXFLAGS) -o $@ $<

all: build

build: $(PROG)

$(PROG): $(OBJS)
        $(CXX) $(CXXFLAGS) $(LDFLAGS) -o $@ $(OBJS) $(LDADD)

clean:
        -rm -f $(OBJS) $(PROG)

rebuild: clean build
Добавлено через 4 минуты
"-ansi -pedantic -pedantic-errors" - просто с ними может не собираться

Во - выдрал из работающей программы.
Тут все разделено.
Во-первым указывается список SRCS - именно сорцы, а не OBJ-файлы.
И все разделено.
DEBUG_FLAGS - отладочные флаги
COPTS - оптимизация
CARCH - указание архитектуры и генерации код под архитектуру
WARN_FLAGS - warnings
CADDS - дополнительный флаги
LDFLAGS - флаги для линкера
LDADD - дополнительный библиотеки
PROG - имя выходной программы
CDEFS - дополнительные DEFS для C.

Добавлено через 45 секунд
MD это специальный флаг,типа позволяющий разрулить автоматически все .h зависимости и их не надо все писать вручную.
А ты делай всегда: make rebuild
Тогда и зависимости пофигу
1
Evg
Эксперт CАвтор FAQ
21245 / 8261 / 636
Регистрация: 30.03.2009
Сообщений: 22,606
Записей в блоге: 30
25.10.2009, 20:22 5
Цитата Сообщение от #pragma Посмотреть сообщение
Делаю программу,которая использует внешнюю библиотеку SDL. В настройках проекта (работаю в Code::Blocks) указал в опциях линкера Project->Build Options->Linker settings в поле Link libraries путь к файлу /usr/lib/libSDL.so.Всё работает.Дело в том,что у меня в проекте используется Makefile,сделанный вручную,а Code::Blocks собирает автоматом,я даже не знаю как.То есть паралельно с ростом программы приходится править Makefile.Как в этом файле правильно указать флаги или пути к библиотеке?
LDFLAGS = -lSDL

Добавлено через 40 секунд
Цитата Сообщение от odip Посмотреть сообщение
А ты делай всегда: make rebuild
Тогда и зависимости пофигу
reboot ещё добавь к этой цели
1
Эксперт С++
7175 / 3234 / 80
Регистрация: 17.06.2009
Сообщений: 14,164
25.10.2009, 20:34 6
reboot ещё добавь к этой цели
Из-под юзера не сработает

LDFLAGS = -lSDL
К тому коду что я привел для библиотек есть отдельный LDADD:
LDADD=-lSDL
1
Временно недоступен
957 / 228 / 14
Регистрация: 12.04.2009
Сообщений: 926
25.10.2009, 20:39  [ТС] 7
А откуда взят сам флаг? это система какая-то?типа libSDL.so = l**SDL.so = -lSDL ? В доках копался-что-то не увидел..
0
Evg
Эксперт CАвтор FAQ
21245 / 8261 / 636
Регистрация: 30.03.2009
Сообщений: 22,606
Записей в блоге: 30
25.10.2009, 20:49 8
Все библиотеки называются lib***, а опция для их подключения -l***
В юниксах принять как-то так. Почему - я не знаю
2
Эксперт С++
7175 / 3234 / 80
Регистрация: 17.06.2009
Сообщений: 14,164
25.10.2009, 23:18 9
Только библиотеки называются libXXX.so или libXXX.a
А флаг нужно указывать -lXXX

Добавлено через 1 минуту
Путь до библиотеки подразумевается стандартный.
Если он не стандартный, то нужно его указать
LDFLAGS=-L/usr/local/lib
2
Evg
Эксперт CАвтор FAQ
21245 / 8261 / 636
Регистрация: 30.03.2009
Сообщений: 22,606
Записей в блоге: 30
26.10.2009, 08:24 10
Цитата Сообщение от odip Посмотреть сообщение
Только библиотеки называются libXXX.so или libXXX.a
А флаг нужно указывать -lXXX
Ага, .a и .so это расширения, а XXX - это имя. Линкеру надо указывать только имя. В режиме динамической линковки он будет сначала искать динамическую библиотеку (*.so), если не найдёт - то поищет статическую. В режиме статической линковки будет искать только статическую. В gcc по умолчанию используется динамическая линковка, по опции -static - статическая

Цитата Сообщение от odip Посмотреть сообщение
Путь до библиотеки подразумевается стандартный.
Если он не стандартный, то нужно его указать
LDFLAGS=-L/usr/local/lib
Ты ж писал, что у тебя в /usr/lib, а оно стандартное
1
Эксперт С++
7175 / 3234 / 80
Регистрация: 17.06.2009
Сообщений: 14,164
26.10.2009, 09:04 11
Линкеру надо указывать только имя
Можно и просто указать /usr/lib/libSDL.so в качестве obj-файла.
1
0 / 0 / 0
Регистрация: 30.10.2009
Сообщений: 4
30.10.2009, 16:52 12
Кто из вас в какой среде программирует? В консоли или графике? Где удобнее начинать? Под Windows писала, а учила C ради Linux. Графика eclipse. Как освоить?
0
10 / 10 / 0
Регистрация: 25.09.2009
Сообщений: 17
30.10.2009, 20:02 13
Цитата Сообщение от Linker Посмотреть сообщение
Кто из вас в какой среде программирует? В консоли или графике? Где удобнее начинать? Под Windows писала, а учила C ради Linux. Графика eclipse. Как освоить?
Учу С++ в Linux. Пользовался раньше KDevelop, сейчас осваиваю Vim. Графика понятнее интуитивно, если не разбираться. Функциональности и индивидуализма больше в консольных.
0
1664 / 1133 / 80
Регистрация: 21.08.2008
Сообщений: 4,725
Записей в блоге: 1
30.10.2009, 21:38 14
Цитата Сообщение от Linker Посмотреть сообщение
Кто из вас в какой среде программирует? В консоли или графике? Где удобнее начинать? Под Windows писала, а учила C ради Linux. Графика eclipse. Как освоить?
Понравился eclipse, чем то напоминает VS, но посложней в настройках.
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
30.10.2009, 21:38
Помогаю со студенческими работами здесь

Какие есть сборки для установки без компиляции?
Есть ли какие-нибудь сборки для моментальной установки без сборки оси? Мне как новичку сложно с...

Какие значения примут флаги после выполнения данного кода
Есть заданная команда mov AL, 2Ch add AL, 54h Какие значения примут флаги ZF, SF, CFи OF.и...

Какие флаги во флаговом регистре изменились при выполнении арифметических операций и почему?
Ребят помогите пожалуйста. Задание. Часть 1. Даны числа а=FEDCh и b=ABCDh (числа в 16-ричном...

Какие файлы необходимы для компиляции и линковки C++ Builder (без графической среды)
В общем надо выдрать только необходимые файлы по минимум, чтоб Builder мог компилировать и...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
14
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2022, CyberForum.ru