Makefile 测试链接器标志的支持

Makefile 测试链接器标志的支持,makefile,ld,Makefile,Ld,我需要测试特定链接器标志(--无未定义的)的支持,然后才能最终将其作为生成文件配方的一部分 并非所有平台都支持此链接器标志(事实上,它会中断macosxlink stage),因此只有在实际支持时才启用它很重要 我倾向于运行时测试,这似乎比静态编译器/系统列表更可取,因为静态编译器/系统列表更难维护 最好从Makefile运行测试,然后有条件地设置标志。最可靠的测试是链接测试,即尝试实际链接某些内容。这种测试将取决于您是通过编译器链接还是直接与链接器链接。我的方法是为测试任意标志创建一个通用模板

我需要测试特定链接器标志(
--无未定义的
)的支持,然后才能最终将其作为
生成文件
配方的一部分

并非所有平台都支持此链接器标志(事实上,它会中断
macosx
link stage),因此只有在实际支持时才启用它很重要

我倾向于运行时测试,这似乎比静态编译器/系统列表更可取,因为静态编译器/系统列表更难维护


最好从
Makefile
运行测试,然后有条件地设置标志。

最可靠的测试是链接测试,即尝试实际链接某些内容。这种测试将取决于您是通过编译器链接还是直接与链接器链接。我的方法是为测试任意标志创建一个通用模板,以便在不同的位置对不同的标志进行重用,例如:

$ cat Makefile
CHECK_CC_FLAGS := -Wl,--no-undefined -Wl,--whatever
CHECK_LD_FLAGS := --no-undefined --whatever

define check_cc_flag
  $(shell echo 'int main() { return 0; }' | $(CC) $(1) -xc - 2>/dev/null && echo $(1))
endef

define check_ld_flag
  $(shell $(LD) $(1) -e 0 /dev/null 2>/dev/null && echo $(1))
endef

# If linking with $(CC)
test: LDFLAGS += $(foreach flag,$(CHECK_CC_FLAGS),$(call check_cc_flag,$(flag)))

# If linking with $(LD)
test_ld: LDFLAGS += $(foreach flag,$(CHECK_LD_FLAGS),$(call check_ld_flag,$(flag)))
test_ld: test.o
        $(LD) $(LDFLAGS) -o $@ $<
$ make test
cc    -c -o test.o test.c
cc   -Wl,--no-undefined     test.o   -o test

$ make test_ld
ld   --no-undefined    -o test_ld test.o
ld: warning: cannot find entry symbol _start; defaulting to 0000000000401000