cgoで作ったStatic LibraryをMacで使おうとしたら困った話

## Go Code

まず初めに、GoでStatic Libraryを作り

```go:example.go
package main

import (
  "C"
  "io"
  "io/ioutil"
  "net/http"
)

//export GetUrl
func GetUrl(url string) (int, *C.char) {
  response, err := http.Get(url)
  if nil != err {
    return 0, nil
  }

  defer func() {
    io.Copy(ioutil.Discard, response.Body)
    response.Body.Close()
  }()

  body, err := ioutil.ReadAll(response.Body)
  if nil != err {
    return 0, nil
  }

  return len(body), C.CString(string(body))
}

func main() {}
```

### Go Code build
```bash:build_static
# build to static library.
$ go build -buildmode=c-archive -o ./libtest.a ./test.go 
```

## Main Code

それを使ってMacで実行ファイルを作ろうとしたんじゃ。

```cpp:main.cpp
#include <iostream>
#include "libtest.h"

int main() {
  const std::string URL{"http://www.yahoo.co.jp"};
  auto data = GetUrl({URL.data(), static_cast <int32_t> (URL.length())});
  if (0 < data.r0) {
    std::cout << std::string(data.r1, data.r0) << std::endl;
    free(data.r1);
  }
}
```

### Main Code build
```bach:build_command
# build to executable.
$ clang++ -O2 -std=c++1z -I./ -L./ main.cpp -ltest
```

### Build Result

でも、そんなSymbol知らねーよとclang様にお叱りを受け

```bash:build_error
Undefined symbols for architecture x86_64:
  "_CFArrayGetCount", referenced from:
      _FetchPEMRoots_MountainLion in libtest.a(000003.o)
      _FetchPEMRoots in libtest.a(000003.o)
  "_CFArrayGetValueAtIndex", referenced from:
      _FetchPEMRoots_MountainLion in libtest.a(000003.o)
      _FetchPEMRoots in libtest.a(000003.o)
  "_CFDataAppendBytes", referenced from:
      _FetchPEMRoots_MountainLion in libtest.a(000003.o)
      _FetchPEMRoots in libtest.a(000003.o)
  "_CFDataCreateMutable", referenced from:
      _FetchPEMRoots_MountainLion in libtest.a(000003.o)
      _FetchPEMRoots in libtest.a(000003.o)
  "_CFDataGetBytePtr", referenced from:
      _FetchPEMRoots_MountainLion in libtest.a(000003.o)
      _FetchPEMRoots in libtest.a(000003.o)
      __cgo_62033c69288a_Cfunc_CFDataGetBytePtr in libtest.a(000003.o)
     (maybe you meant: __cgo_62033c69288a_Cfunc_CFDataGetBytePtr)
  "_CFDataGetLength", referenced from:
      _FetchPEMRoots_MountainLion in libtest.a(000003.o)
      _FetchPEMRoots in libtest.a(000003.o)
      __cgo_62033c69288a_Cfunc_CFDataGetLength in libtest.a(000003.o)
     (maybe you meant: __cgo_62033c69288a_Cfunc_CFDataGetLength)
  "_CFDictionaryGetValueIfPresent", referenced from:
      _FetchPEMRoots in libtest.a(000003.o)
  "_CFEqual", referenced from:
      _FetchPEMRoots in libtest.a(000003.o)
  "_CFNumberGetValue", referenced from:
      _FetchPEMRoots in libtest.a(000003.o)
  "_CFRelease", referenced from:
      _FetchPEMRoots_MountainLion in libtest.a(000003.o)
      _FetchPEMRoots in libtest.a(000003.o)
      __cgo_62033c69288a_Cfunc_CFRelease in libtest.a(000003.o)
     (maybe you meant: __cgo_62033c69288a_Cfunc_CFRelease)
  "_CFStringCreateWithCString", referenced from:
      _FetchPEMRoots in libtest.a(000003.o)
  "_SecCertificateCopyNormalizedIssuerContent", referenced from:
      _FetchPEMRoots in libtest.a(000003.o)
  "_SecCertificateCopyNormalizedSubjectContent", referenced from:
      _FetchPEMRoots in libtest.a(000003.o)
  "_SecKeychainItemExport", referenced from:
      _FetchPEMRoots_MountainLion in libtest.a(000003.o)
      _FetchPEMRoots in libtest.a(000003.o)
  "_SecTrustCopyAnchorCertificates", referenced from:
      _FetchPEMRoots_MountainLion in libtest.a(000003.o)
  "_SecTrustSettingsCopyCertificates", referenced from:
      _FetchPEMRoots in libtest.a(000003.o)
  "_SecTrustSettingsCopyTrustSettings", referenced from:
      _FetchPEMRoots in libtest.a(000003.o)
  "_kCFAllocatorDefault", referenced from:
      _FetchPEMRoots_MountainLion in libtest.a(000003.o)
      _FetchPEMRoots in libtest.a(000003.o)
ld: symbol(s) not found for architecture x86_64
clang: error: linker command failed with exit code 1 (use -v to see invocation)
```


## 解決

途方に暮れていたら、いんたーねっと様から啓示を受け
パラメーター(framework)を追加したら解決しましたとさ。

```bash:build_success
$ clang++ -O2 -std=c++1z -I./ -L./ main.cpp  -ltest -framework CoreFoundation -framework Security
$ ./a.out
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="content-type" content="text/html; charset=utf-8">
<meta http-equiv="content-style-type" content="text/css">
<meta http-equiv="content-script-type" content="text/javascript">
<meta name="description" content="日本最大級のポータルサイト。検索、オークション、ニュース、メール、コミュニティ、ショッピング、など80以上のサービスを展開。あなたの生活をより豊かにする「ライフ・エンジン」を目指していきます。">
<meta name="robots" content="noodp">


~~~ 中略 ~~~


<td align="center">Copyright (C) 2017 Yahoo Japan Corporation. All Rights Reserved.</td>
</tr>
</table>
</td>
</tr>
</table>
</center>
</body>
</html>

<!-- p06.f13.top.kks.yahoo.co.jp Tue Jul 25 12:36:20 JST 2017 -->

```