2012-06-30 2 views
4

Мне сложно определить, какие флаги передать g ++ при выполнении связывания. В принципе, я компилировать код с этими "стандартными" флагами:Связывание объектов и статических библиотек

CXXFLAGS = -Wall -Wextra -Wconversion -pedantic -std=c++0x -O2 

и, после этого, я объединить полученные .o файлы в нескольких статических библиотеках, как так:

libxxx.a: xxx1.o xxx2.o ... 
    ar rcs [email protected] $^ 
libyyy.a: yyy1.o yyy2.o ... 
    ar rcs [email protected] $^ 
... 

Вопросов:

  • Должен ли я использовать флаг -static в CXXFLAGS при компиляции файлов .o?

После создания статических библиотек, я хочу, чтобы связать некоторые скомпилированные .o файлы вместе с некоторыми из этих библиотек в целях создания исполняемого файла, поэтому я использую это:

LINKER = g++ 
LIB_DIR = lib/linux 
SYSTEM_LIBS = -lgmp 
LDFLAGS = -Wall -L $(OUTPUT_DIR) -L $(LIB_DIR) $(SYSTEM_LIBS) 
$(LINKER) $^ $(LDFLAGS) -lsvm -lUtils -lKinderedSpirits -o [email protected] 

exe: 
    $(LINKER) o1.o o2.o $(LDFLAGS) -lxxx -lyyy -lzzz -o [email protected] 

Вопросы:

- Должен ли я использовать флаг -static здесь? - Имеет ли смысл -Wall или он полезен только для компиляции? - Существуют ли какие-либо другие «стандартные» флаги, которые необходимо передать компоновщику, аналогичные тем, которые рекомендованы для компилятора?

Кроме того, при связывании это дает мне исключения о неопределенных ссылках из библиотеки GMP. Насколько я могу судить, -lgmp отправляется в компоновщик, и он устанавливается в систему (я смог скомпилировать простой мир привет, который использует GMP из командной строки) и libxxx.a libyyy.a libzzz.a расположенный в $ (LIB_DIR). Может быть, я должен упомянуть, что символы GMP используются в libxxx.a.


UPDATE:

мне удалось зафиксировать неопределенные ссылки для GMP символов. Проблема была вызвана порядком, в котором я размещал библиотеки. В принципе, как указано here, мне нужно обратиться к библиотекам, которые зависят от GMP до -lgmp. Во всяком случае, я все еще ищу ответы на мои вопросы выше.

+0

Когда вы говорите «статическая библиотека», вы имеете в виду, что вы создали файл статической библиотеки .a, возможно, используя ar? – loki11

+0

Да, это так. Я отредактирую вопрос, чтобы уточнить. –

ответ

2

В: Должен ли я использовать здесь -статический флаг? A: Наверное, не нужно. Этот флаг просто не позволяет случайно связать динамические библиотеки.

Вопрос: Есть ли смысл здесь иметь смысл или он полезен только для компиляции? A: Я считаю, что это просто для компиляции. (fyi, столица W, за которой следует слово «все», вы хотите, чтобы во время компиляции были все предупреждения)

В: Существуют ли какие-либо другие «стандартные» флаги, которые необходимо передать в компоновщик, аналогичные тем, которые рекомендованы для компилятор? A: Не то, о чем я знаю. Вы можете найти общие опции здесь: http://gcc.gnu.org/onlinedocs/gcc/Link-Options.html

Вы сталкиваетесь с какой-либо конкретной ошибкой, которую вы хотели бы вставить?

+0

Теперь это компиляция и соединение очень хорошо, но я хотел убедиться, что я делаю это правильно. Что касается ссылки, я могу использовать Google сам, спасибо, но мне было интересно, есть ли какие-то руководства для непрофессионалов, какие флагов компоновщика считаются «стандартными» и должны (почти) всегда использоваться, например, флагов компилятора, о которых я упоминал. –

+0

Насколько я использовал, нет. – loki11

+1

Вообще говоря, аргументы командной строки позволяют сообщать компилятору, что вы хотите. Если вы сами не знаете, чего хотите, то это все. Либо у вас есть причина для определенного флага, либо нет. Если да, то знаешь. Если вы этого не сделаете, зачем это делать? Возможно, вам следует почесывать gcc manpage, чтобы понять, что там для начала. –

Смежные вопросы