Skip to content

Commit c4bd464

Browse files
committed
Site updated: 2018-06-28 21:52:01
1 parent b611a9e commit c4bd464

File tree

2 files changed

+7
-4
lines changed

2 files changed

+7
-4
lines changed

2018/06/26/CGO/index.html

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,7 @@
1313
<meta property="og:site_name" content="Whyyy">
1414
<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">
1515
<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">
1717
<meta name="twitter:card" content="summary">
1818
<meta name="twitter:title" content="CGO">
1919
<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">
103103
<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 &lt;stdio.h&gt;</span></span><br><span class="line"><span class="comment">// #include &lt;errno.h&gt;</span></span><br><span class="line"><span class="keyword">import</span> <span class="string">"C"</span></span><br></pre></td></tr></table></figure>
104104
<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>
105105
<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 &lt;png.h&gt;</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 &lt;png.h&gt;</span></span><br><span class="line"><span class="keyword">import</span> <span class="string">"C"</span></span><br></pre></td></tr></table></figure>
107107
<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>
108108
<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 &lt;png.h&gt;</span></span><br><span class="line"><span class="keyword">import</span> <span class="string">"C"</span></span><br></pre></td></tr></table></figure>
109109
<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$&#123;SRCDIR&#125;/libs -l foo</span></span><br></pre></td></tr></table></figure>
110110
<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>
111114
<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>
112115
<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>
113116
<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

Comments
 (0)