【问题标题】:Makefile for Linux and Mac with address sanitizer带有地址清理器的 Linux 和 Mac 的 Makefile
【发布时间】:2017-11-14 01:42:36
【问题描述】:

我正在尝试编写一个可以在 linux 和 mac 上使用的 makefile,它使用地址清理程序构建。这适用于我的 vagrant 实例:

CC         = gcc
ASAN_FLAGS = -fsanitize=address -fno-omit-frame-pointer -Wno-format-security
ASAN_LIBS  = -static-libasan
CFLAGS    := -Wall -Werror --std=gnu99 -g3
LDFLAGS   += -lpthread

all: hello

hello: tiny_queue.o hello.o
    $(CC) -o $@ $(CFLAGS) $(ASAN_FLAGS) $(CURL_CFLAGS) $^ $(LDFLAGS) $(CURL_LIBS) $(ASAN_LIBS)

这适用于ubuntu/trusty64,但在我的mac上失败了

$ make
gcc -Wall -Werror --std=gnu99 -g3 -I/opt/X11/include  -c -o hello.o hello.c
gcc -o hello -Wall -Werror --std=gnu99 -g3 -fsanitize=address -fno-omit-frame-pointer -Wno-format-security  tiny_queue.o hello.o -lpthread  -static-libasan
clang: error: unknown argument: '-static-libasan'
make: *** [hello] Error 1

有人知道如何为mac和linux编写兼容的makefile吗?

附言我对 C 很陌生,如果这个问题非常基础,我很抱歉。

【问题讨论】:

  • 使用-pthread 标志为编译器和链接器构建多线程代码。 -lpthread 不够用。
  • 这与C语言无关。 (严格来说甚至不是 makefile 问题)。

标签: linux macos makefile clang


【解决方案1】:
CC         = gcc
ASAN_FLAGS = -fsanitize=address -fno-omit-frame-pointer -Wno-format-security
ASAN_LIBS  = -static-libasan
CFLAGS    := -Wall -Werror --std=gnu99 -g3
LDFLAGS   += -lpthread

all: hello

hello: tiny_queue.o hello.o
    $(CC) -o $@ $(CFLAGS) $(ASAN_FLAGS) $(CURL_CFLAGS) $^ $(LDFLAGS) $(CURL_LIBS) $(ASAN_LIBS)

您应该指定 Asan 库(或 UBsan 库,就此而言)。由于您使用编译器驱动程序来驱动链接,因此只需使用-fsanitize=address(这是推荐的做法)。 不要添加-static-libasan。编译器驱动程序将为您添加适当的库。

【讨论】:

  • 谢谢,成功了。我删除了ASAN_LIBS 部分,因为-fsanatize=address 已经在ASAN_FLAGS 中。
猜你喜欢
  • 2011-10-09
  • 2020-10-15
  • 1970-01-01
  • 2012-02-20
  • 2018-05-16
  • 2019-02-07
  • 2012-01-07
  • 1970-01-01
  • 2012-05-22
相关资源
最近更新 更多