登录
  • 人们都希望被别人需要 却往往事与愿违
  • 如果建筑工人像程序员写软件那样盖房子, 那第一只飞来的啄木鸟就能毁掉人类文明@Gerald Weinberg (软件工程大牛)

在M1 Mac下开发WebP Server Go

编程 Benny小土豆 3271次浏览 1970字 0个评论
文章目录[显示]

最近换了M1的Mac,成为了ARM芯片的受害者。在尝试用Go运行WebP Server Go的时候出错了

在M1 Mac下开发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应该用CPATHC_INCLUDE_PATHCPLUS_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/

在M1 Mac下开发WebP Server Go

 


文章版权归原作者所有丨本站默认采用CC-BY-NC-SA 4.0协议进行授权|
转载必须包含本声明,并以超链接形式注明原作者和本文原始地址:
https://dmesg.app/m1-aom.html
喜欢 (18)
分享:-)
关于作者:
If you have any further questions, feel free to contact me in English or Chinese.
发表我的评论(代码和日志请使用Pastebin或Gist)
取消评论

                     

去你妹的实名制!

  • 昵称 (必填)
  • 邮箱 (必填,不要邮件提醒可以随便写)
  • 网址 (选填)