我正在为C编写Makefile。我希望能够通过环境变量指定编译和链接的不同程序。但是,我希望它在没有任何其他变量的情况下工作。我试图与ld联系。但是,默认情况下不与标准C库链接。
问题:
如何将C程序与ld或$ LD链接
是否有可能从cc获得适当的标志?
我无法使用$(CC)
代替$(LD)
。 LD ?= cc
也不起作用。
我想要这样的事情是真的:
环境变量CC设置为tcc。
环境变量LD未设置。
我的Makefile使用tcc进行编译,并使用C的系统默认链接器进行链接。
不幸的是,有些C编译器无法链接某些库。我有tcc和glfw这个问题。
P.S。
Linux用户
答案 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_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
我希望能正确理解你的问题。对不起,如果我误解了,请告诉我,我错了。