|
13 | 13 | <meta property="og:site_name" content="Whyyy">
|
14 | 14 | <meta property="og:description" content="cgo is an amazing technology which allows Go programs to interoperate with C libraries. Given a Go source file written with some special features, cgo outputs Go and C files that can be combined into">
|
15 | 15 | <meta property="og:locale" content="default">
|
16 |
| -<meta property="og:updated_time" content="2018-06-26T08:57:04.482Z"> |
| 16 | +<meta property="og:updated_time" content="2018-06-28T13:51:20.929Z"> |
17 | 17 | <meta name="twitter:card" content="summary">
|
18 | 18 | <meta name="twitter:title" content="CGO">
|
19 | 19 | <meta name="twitter:description" content="cgo is an amazing technology which allows Go programs to interoperate with C libraries. Given a Go source file written with some special features, cgo outputs Go and C files that can be combined into">
|
@@ -103,11 +103,14 @@ <h1 class="article-title" itemprop="name">
|
103 | 103 | <h2 id="cgo-directives"><a href="#cgo-directives" class="headerlink" title="cgo directives"></a>cgo directives</h2><figure class="highlight golang"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment">// #include <stdio.h></span></span><br><span class="line"><span class="comment">// #include <errno.h></span></span><br><span class="line"><span class="keyword">import</span> <span class="string">"C"</span></span><br></pre></td></tr></table></figure>
|
104 | 104 | <p>CFLAGS, CPPFLAGS, CXXFLAGS, FFLAGS, LDFLAGS may be defined with pseudo <code>#cgo</code> directives within these comments to tweak the behavior of the C, C++ or Fortran compiler. Values defined in multiple directives are concatenated together. The directive can include a list of build constraints limiting its effect to systems satisfying one of the constraints.</p>
|
105 | 105 | <p>cgo recognizes this comment. Any lines starting with <code>#cgo</code> followed by a space character are removed; these become directives for cgo. The remaining lines are used as a header when compiling the C parts of the package. In this case those lines are just a single <code>#include</code> statement, but they can be almost any C code. The <code>cgo</code> directives are used to provide flags for the compiler and linker when building the C parts of the package.</p>
|
106 |
| -<figure class="highlight golang"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment">// #cgo CFLAGS: -DPNG_DEBUG=1</span></span><br><span class="line"><span class="comment">// #cgo amd64 386 CF:AGS: -D86=1</span></span><br><span class="line"><span class="comment">// #cgo LDFLAGS: -lpng</span></span><br><span class="line"><span class="comment">// #include <png.h></span></span><br><span class="line"><span class="keyword">import</span> <span class="string">"C"</span></span><br></pre></td></tr></table></figure> |
| 106 | +<figure class="highlight golang"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment">// #cgo CFLAGS: -DPNG_DEBUG=1</span></span><br><span class="line"><span class="comment">// #cgo amd64 386 CFLAGS: -D86=1</span></span><br><span class="line"><span class="comment">// #cgo LDFLAGS: -lpng</span></span><br><span class="line"><span class="comment">// #include <png.h></span></span><br><span class="line"><span class="keyword">import</span> <span class="string">"C"</span></span><br></pre></td></tr></table></figure> |
107 | 107 | <p>Alternatively, CPPFLAGS and LDFLAGS may be obtained via the pkg-config tool using a ‘#cgo pkg-config:’ directive followed by the package names. For example:</p>
|
108 | 108 | <figure class="highlight golang"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment">// #cgo pkg-config: png cairo</span></span><br><span class="line"><span class="comment">// #include <png.h></span></span><br><span class="line"><span class="keyword">import</span> <span class="string">"C"</span></span><br></pre></td></tr></table></figure>
|
109 | 109 | <figure class="highlight golang"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment">// #cgo LDFLAGS -L${SRCDIR}/libs -l foo</span></span><br></pre></td></tr></table></figure>
|
110 | 110 | <figure class="highlight golang"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment">// #cgo LDFLAGS -L/go/src/foo/libs -l foo</span></span><br></pre></td></tr></table></figure>
|
| 111 | +<p><code>-L</code> is the path to the directories containing the libraries. A search path for libraries.<br><code>-l</code> is the name of the library you want to link to.</p> |
| 112 | +<p>For instance, if you want to link to the library <code>~/libs/libabc.a</code> you’d add:</p> |
| 113 | +<figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">-L$(HOME)/libs -labc</span><br></pre></td></tr></table></figure> |
111 | 114 | <figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br></pre></td><td class="code"><pre><span class="line">| file | compiler |</span><br><span class="line">| ------------------------------- |:-----------------:|</span><br><span class="line">| xxx.c, xxx.s, xxx.S | C compiler |</span><br><span class="line">| xxx.cc, xxx.cpp, xxx.cxx | C++ compiler |</span><br><span class="line">| xxx.f, xxx.F, xxx.for, xxx.f90 | fortran compiler |</span><br><span class="line"></span><br><span class="line">Any .h, .hh, .hpp or .hxx files will not be compiled separately, but if these header files are changed, the C and C++ files will be recompiled.</span><br></pre></td></tr></table></figure>
|
112 | 115 | <h2 id="basic-data-type-conversion"><a href="#basic-data-type-conversion" class="headerlink" title="basic data type conversion"></a>basic data type conversion</h2><figure class="highlight c"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br></pre></td><td class="code"><pre><span class="line">| C | Go |</span><br><span class="line">| ------------------- |:---------------:|</span><br><span class="line">| <span class="keyword">char</span> | C.<span class="keyword">char</span> |</span><br><span class="line">| <span class="keyword">signed</span> <span class="keyword">char</span> | C.schar |</span><br><span class="line">| <span class="keyword">unsigned</span> <span class="keyword">char</span> | C.uchar |</span><br><span class="line">| <span class="keyword">short</span> | C.<span class="keyword">short</span> |</span><br><span class="line">| <span class="keyword">unsigned</span> <span class="keyword">short</span> | C.ushort |</span><br><span class="line">| <span class="keyword">int</span> | C.<span class="keyword">int</span> |</span><br><span class="line">| <span class="keyword">unsigned</span> <span class="keyword">int</span> | C.uint |</span><br><span class="line">| <span class="keyword">long</span> | C.<span class="keyword">long</span> |</span><br><span class="line">| <span class="keyword">unsigned</span> <span class="keyword">long</span> | C.ulong |</span><br><span class="line">| <span class="keyword">long</span> <span class="keyword">long</span> | C.longlong |</span><br><span class="line">| <span class="keyword">unsigned</span> <span class="keyword">long</span> <span class="keyword">long</span> | C.ulonglong |</span><br><span class="line">| <span class="keyword">float</span> | C.<span class="keyword">float</span> |</span><br><span class="line">| <span class="keyword">double</span> | C.<span class="keyword">double</span> |</span><br><span class="line">| <span class="keyword">complex</span> <span class="keyword">float</span> | C.complexfloat |</span><br><span class="line">| <span class="keyword">complex</span> <span class="keyword">double</span> | C.complexdouble |</span><br><span class="line">| <span class="keyword">long</span> <span class="keyword">long</span> | C.longlong |</span><br><span class="line">| <span class="keyword">void</span> * | unsafe.Pointer |</span><br><span class="line">| <span class="keyword">__int128_t</span> | [<span class="number">16</span>]byte |</span><br><span class="line">| <span class="keyword">__uint128_t</span> | [<span class="number">16</span>]byte |</span><br><span class="line">| few special C types | uintptr |</span><br></pre></td></tr></table></figure>
|
113 | 116 | <figure class="highlight c"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br></pre></td><td class="code"><pre><span class="line">| C | Go |</span><br><span class="line">| ---------------- |:-----------------:|</span><br><span class="line">| <span class="keyword">sizeof</span>(T) | C.sizeof_T |</span><br><span class="line">| <span class="keyword">sizeof</span>(struct T) | C.sizeof_struct_T |</span><br><span class="line">| <span class="class"><span class="keyword">struct</span> <span class="title">X</span> | <span class="title">C</span>.<span class="title">struct_X</span> |</span></span><br><span class="line"><span class="class">| <span class="title">union</span> <span class="title">X</span> | <span class="title">C</span>.<span class="title">union_X</span> |</span></span><br><span class="line"><span class="class">| <span class="title">enum</span> <span class="title">X</span> | <span class="title">C</span>.<span class="title">enum_X</span> |</span></span><br></pre></td></tr></table></figure>
|
|
0 commit comments