最近换了M1的Mac,成为了ARM芯片的受害者。在尝试用Go运行WebP Server Go的时候出错了
看起来是没有安装aom,但是brew install
了一下还是有的啊。另一边的Intel Mac就没这个问题。
╰─$ ls /opt/homebrew/opt/aom/include/aom aom.h aom_external_partition.h aomcx.h aom_codec.h aom_frame_buffer.h aomdx.h aom_decoder.h aom_image.h aom_encoder.h aom_integer.h
头文件明明是有的!
想了一下, 原因可能是因为M1的homebrew会把相关的依赖安装到 /opt/homebrew
下,而不像Intel的版本会丢在/usr/local/
下,而/usr/local/
大概率是gcc默认的搜索路径。所以gcc compiler找不到对应的头文件了。
创建了一个简单的test.c
验证一下
#include #include #include <aom/aom_encoder.h> int main() { // printf() displays the string inside quotation printf("Hello, World!"); return 0; }
╰─$ gcc test.c
test.c:3:10: fatal error: 'aom/aom_encoder.h' file not found
#include <aom/aom_encoder.h>
^~~~~~~~~~~~~~~~~~~
1 error generated.
果真如此,那么就export一下CFLAGS吧
╰─$ export CFLAGS=I/opt/homebrew/opt/aom/include/ 1 ↵ ╭─benny@MBP ~/Downloads ╰─$ gcc test.c test.c:3:10: fatal error: 'aom/aom_encoder.h' file not found #include <aom/aom_encoder.h> ^~~~~~~~~~~~~~~~~~~ 1 error generated.
依旧报错。为什么CFLAGS不生效呢?
试试把aom符号连接到 /usr/local/include
? 这个目录应该是默认搜索的。
❯ ln -s /opt/homebrew/opt/aom/include/aom /usr/local/include ~/Downloads ❯ gcc test.c
没有报错,证明我的推断是正确的。
突然想到,macOS的这个gcc,其实是clang啊,那么是不是和正常的gcc用的环境变量不同?搜了一下还真是,clang应该用CPATH
,C_INCLUDE_PATH
和CPLUS_PATH
之类的,具体可以参考这里 https://clang.llvm.org/docs/CommandGuide/clang.html
把符号连接删掉,再试试看!
└> gcc test.c test.c:3:10: fatal error: 'aom/aom_encoder.h' file not found #include <aom/aom_encoder.h> ^~~~~~~~~~~~~~~~~~~ 1 error generated. ┌[kiwish-4.2]-(~/Downloads)- └> export CPATH=/opt/homebrew/opt/aom/include/ ┌[kiwish-4.2]-(~/Downloads)- └> gcc test.c
果真如此!于是Goland加一个环境变量,再次编译
/opt/homebrew/Cellar/go/1.19/libexec/pkg/tool/darwin_arm64/link: running clang failed: exit status 1 ld: library not found for -laom clang: error: linker command failed with exit code 1 (use -v to see invocation)
看起来是LDFLAGS的问题,猜测clang还是用的奇奇怪怪的环境变量。先link一下看看
ln -s /opt/homebrew/opt/aom/lib/* /usr/local/lib/
再运行,果真好了。那么如何用环境变量解决问题呢?我不太喜欢在系统目录里link来link去的。
搜了一圈,正确的环境变量的名字叫LIBRARY_PATH
LIBRARY_PATH=/opt/homebrew/opt/aom/lib/
总结
Clang真坑
设置两个环境变量就好了
CPATH=/opt/homebrew/opt/aom/include/;LIBRARY_PATH=/opt/homebrew/opt/aom/lib/