如何在Makefile中替换LD变量来链接C对象

时间:2012-01-01 16:55:42

标签: c makefile ld

我正在为C编写Makefile。我希望能够通过环境变量指定编译和链接的不同程序。但是,我希望它在没有任何其他变量的情况下工作。我试图与ld联系。但是,默认情况下不与标准C库链接。

问题:
如何将C程序与ld或$ LD链接
是否有可能从cc获得适当的标志?

我无法使用$(CC)代替$(LD)LD ?= cc也不起作用。

我想要这样的事情是真的:
环境变量CC设置为tcc。
环境变量LD未设置。
我的Makefile使用tcc进行编译,并使用C的系统默认链接器进行链接。

不幸的是,有些C编译器无法链接某些库。我有tcc和glfw这个问题。

P.S。
Linux用户

4 个答案:

答案 0 :(得分:5)

条件赋值 $(LD)?= cc 无法使用,因为$(LD)是预定义的。

如果要在没有预定义变量的情况下启动make,请使用选项-R:

   > make -p | grep LD
   ... 
   LD = ld
   ...
   > make -p -R | grep LD
   >

答案 1 :(得分:3)

不使用ld作为链接器,而是使用gcc或g ++。他们添加了适当的命令行选项来获取库和启动代码等。换句话说:

ld -o main main.o

相当于:

gcc -o main main.o

除了gcc在调用ld时添加所有命令行参数。

换句话说:LD = gcc。

答案 2 :(得分:2)

tcc的一个主要特点是:

  

tcc 是一个编译器一个链接器,它直接编译和执行C源代码。没有必要的链接或组装

tcc documentation中有更详细的内容,它说的是链接:

  

可以输出动态ELF库,但C编译器不会生成位置无关代码(PIC)。这意味着TCC生成的动态库代码尚不能在进程之间进行分解。

这意味着,如果你想使用tcc,你需要与tcc链接。

答案 3 :(得分:0)

如我所见,您可以为变量定义依赖于规则的值。

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_arbitrarylink_arbitrary)必须遵循相同的命令行。

因此,您可以使用自定义makeCC变量调用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

我希望能正确理解你的问题。对不起,如果我误解了,请告诉我,我错了。