<?xml version="1.0" encoding="UTF-8" ?>
<rss version="2.0">
<channel>
<title><![CDATA[向东博客 专注WEB应用 构架之美 --- 构架之美，在于尽态极妍 | 应用之美，在于药到病除]]></title> 
<link>http://jackxiang.com/index.php</link> 
<description><![CDATA[赢在IT，Playin' with IT,Focus on Killer Application,Marketing Meets Technology.]]></description> 
<language>zh-cn</language> 
<copyright><![CDATA[向东博客 专注WEB应用 构架之美 --- 构架之美，在于尽态极妍 | 应用之美，在于药到病除]]></copyright>
<item>
<link>http://jackxiang.com/post//</link>
<title><![CDATA[如何实现C和C++函数互相调用]]></title> 
<author>jack &lt;xdy108@126.com&gt;</author>
<category><![CDATA[WEB2.0]]></category>
<pubDate>Sat, 08 May 2010 01:34:25 +0000</pubDate> 
<guid>http://jackxiang.com/post//</guid> 
<description>
<![CDATA[ 
	〈一〉如何实现C中调用C++<br/>如何用c语言调用c++做成的动态链接库, 转至<br/>http://blog.donews.com/xzwenlan/archive/2005/05/31/405799.aspx<br/>链接库头文件:<br/><div class="code"><br/>//head.h<br/>class A<br/>&#123;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;public:<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;A();<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;virtual ~A();<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;int gt();<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;int pt();<br/>private:<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;int s;<br/>&#125;;<br/>.cpp<br/>//firstso.cpp<br/>#include &lt;iostream&gt;<br/>#include &quot;head.h&quot;<br/>A::A()&#123;&#125;<br/>A::~A()&#123;&#125;<br/>int A::gt()<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&#123;<br/>s=10;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&#125;<br/>int A::pt()<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&#123;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;std::cout&lt;&lt;s&lt;&lt;std::endl;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&#125;<br/></div><br/>编译命令如下:<br/>g++ -shared -o libmy.so firstso.cpp<br/>这时候生成libmy.so文件,将其拷贝到系统库里面:/usr/lib/<br/>进行二次封装:<br/>.cpp<br/><div class="code"><br/>//secso.cpp<br/>#include &lt;iostream&gt;<br/>#include &quot;head.h&quot;<br/>extern &quot;C&quot;<br/>&#123;<br/>int f();<br/>int f()<br/>&#123;<br/>A a;<br/>a.gt();<br/>a.pt();<br/>return 0;<br/>&#125;<br/>&#125;<br/></div><br/>编译命令:<br/>gcc -shared -o sec.so secso.cpp -L. -lmy<br/>这时候生成第二个.so文件,此时库从一个类变成了一个c的接口.<br/>拷贝到/usr/lib<br/>下面开始调用:<br/>//test.c<br/><div class="code"><br/>#include &quot;stdio.h&quot;<br/>#include &quot;dlfcn.h&quot;<br/>#define SOFILE &quot;sec.so&quot;<br/>int (*f)();<br/>int main()<br/>&#123;<br/>void *dp;<br/>dp=dlopen(SOFILE,RTLD_LAZY);<br/>f=dlsym(dp,&quot;f&quot;);<br/>f();<br/>return 0;<br/>&#125;<br/></div><br/>编译命令如下:<br/><div class="code">gcc -rdynamic -s -o myapp test.c</div><br/>运行Z$./myapp<br/>10<br/>$<br/>关于这个文章的一点补充，转至http://blogs.sun.com/lirincy/<br/>这篇blog写了怎样用C调用C++的库，我试验了一下，在linux上成功，<br/>有两个地方要改一下，最后的编译语句应该是：<br/><div class="code"><br/>gcc -rdynamic -s -o -ldl myapp test.c<br/></div><br/>还有就是test.c最后应该加上：<br/>dlclose(dp);<br/>否则会CoreDump。<br/>实际上他是把类的方法变成了一个可以外部调用的C函数，用extern C。<br/>二〉C++程序如何调用C语言写的库,如a.lib等，有对应的库头文件a.h。假设a.h中定义了函数:<br/>int WhyCoding(int a, float b);<br/>做法是,<br/><div class="code"><br/>extern &quot;C&quot; &#123;<br/>#include &quot;a.h&quot;<br/>&#125;<br/><br/>或<br/> <br/>extern &quot;C&quot; &#123;<br/>int WhyCoding(int a, float b);<br/>&#125;<br/></div><br/>从上面可以看出，extern "C" 是用在C和C++之间的桥梁。之所以需要这个桥梁是因为C编译器编译函数时不带<br/>函数的类型信息，只包含函数符号名字，如C编译器把函数int a(float x)编译成类似_a这样的符号，C连接器只要<br/>找到了调用函数的符号，就可以连接成功，它假设参数类型信息是正确的，这是C编译连接器的缺点。而C++<br/>编译器为了实现函数重载，编译时会带上函数的类型信息，如他把上面的a函数可能编译成_a_float这样的<br/>符号为了实现重载，注意它还是没有带返回值得信息，这也是为什么C++不支持采用函数返回值来区别函数<br/>重载的原因之一，当然，函数的使用者对函数返回值的处理方式（如忽略）也是重要原因。<br/><br/>基于以上，C调用C++，首先需要用封装函数把对C++的类等的调用封装成C函数以便C调用，于是extern "C" 的<br/>作用是：让编译器知道这件事，然后以C语言的方式编译和连接封装函数.（通常是把封装函数用C++编译器按C++<br/>方式编译，用了extern "C" 后，编译器便依C的方式编译封装接口，当然接口函数里面的C++语法还是按C++方式<br/>编译；对于C语言部分--调用者，还是按C语言编译；分别对C++接口部分和C部分编译后，再连接就可以实现C<br/>调用C++了）.<br/><br/>相反,C++调用C函数，extern "C" 的作用是：让C++连接器找调用函数的符号时采用C的方式，即使用_a而不是<br/>_a_float来找调用函数。<br/> <br/>chai, zheng 1:20 AM, Nov 29, 2006 at nanjing, China
]]>
</description>
</item><item>
<link>http://jackxiang.com/post//#blogcomment</link>
<title><![CDATA[[评论] 如何实现C和C++函数互相调用]]></title> 
<author> &lt;user@domain.com&gt;</author>
<category><![CDATA[评论]]></category>
<pubDate>Thu, 01 Jan 1970 00:00:00 +0000</pubDate> 
<guid>http://jackxiang.com/post//#blogcomment</guid> 
<description>
<![CDATA[ 
	
]]>
</description>
</item>
</channel>
</rss>