Как заменить переменную LD в Makefile, чтобы связать объекты C - PullRequest
3 голосов
/ 01 января 2012

Я пишу Makefile для C. Я хочу иметь возможность указывать разные программы для компиляции и связывания через переменные окружения. Однако я хочу, чтобы он работал без каких-либо дополнительных переменных. Я пытался связаться с ld. Однако значение по умолчанию не связано со стандартной библиотекой C.

Вопрос:
Как связать программу C с ld или $ LD
Можно ли получить соответствующие флаги от cc?

Я не могу использовать $(CC) вместо $(LD). LD ?= cc тоже не работает.

Я хочу, чтобы что-то подобное было правдой:
Переменная окружения CC установлена ​​в tcc.
Переменная окружения LD не установлена.
Мой Makefile компилируется с использованием tcc и link, используя системный компоновщик по умолчанию для C.

К сожалению, некоторые компиляторы C не могут связать некоторые библиотеки. У меня такая проблема с tcc и glfw.

приписка
Пользователь Linux

Ответы [ 4 ]

5 голосов
/ 27 февраля 2012

Условное присвоение $ (LD)? = Cc не может работать, так как $ (LD) предопределено.

Если вы хотите начать make без предопределенных переменных, используйте опцию -R:

   > make -p | grep LD
   ... 
   LD = ld
   ...
   > make -p -R | grep LD
   >
3 голосов
/ 01 января 2012

Вместо использования ld в качестве компоновщика используйте gcc или g ++.Они добавляют соответствующие параметры командной строки для получения библиотек и кода запуска и т. Д. Другими словами:

ld -o main main.o

эквивалентно:

gcc -o main main.o

за исключением того, что gcc добавляет всю командную строкупараметры при вызове ld.

Другими словами: LD = gcc.

2 голосов
/ 27 февраля 2012

Одной из основных особенностей tcc является то, что:

tcc является компилятором и компоновщиком [...] он компилирует и выполняет исходный код на C напрямую.Связывание или сборка не требуетсяКомпилятор C не генерирует позиционно-независимый код (PIC).Это означает, что динамический код библиотеки, сгенерированный TCC, еще не может быть разложен между процессами.

Это означает, что если вы хотите использовать tcc, вам нужно будет связаться с tcc.

0 голосов
/ 01 марта 2012

Как я вижу, вы можете определить зависимые от правила значения для переменных.

build_with_tcc: CC=tcc compile_tcc

compile_tcc:
    ## Commands to do a full build with tcc.

build_with_gcc: CC=gcc LD=g++ link_gcc

compile_gcc:
    ## Commands to compile with gcc.

link_gcc: compile_gcc
    ## Commands to link with g++.

И построить его, вызвав соответствующее правило.

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

Правило:

build_with_arbitrary: compile_arbitrary link_arbitrary

Подразумевается, что ваша сборка должна быть выполнена в два этапа и соответствующие правила(compile_arbitrary и link_arbitrary) должны подчиняться одной и той же командной строке.

Таким образом, вы можете вызывать make с пользовательскими CC и LD переменными:

CC=any_cc LD=any_ld make build_with_arbitrary

Наконец,вы можете добавить грязную проверку на пустоту LD на этапе компоновщика и выполнять ее только в том случае, если нет.

link_arbitrary:
    [ -n "$(LD)" ] && do_linker_stuff

Таким образом, вы можете использовать build_with_arbitrary даже для компилятора, который делает все за один шаг.шаг просто пройдя мимо:

CC=any_cc LD= make build_with_arbitrary

Я надеюсь, что правильно понял ваш вопрос.Извините, если я неправильно понял, и, пожалуйста, скажите мне, где я был неправ.

...