<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>ubuntu,debian,redhat -linuxany.com &#187; gcc</title>
	<atom:link href="http://www.linuxany.com/archives/tag/gcc/feed" rel="self" type="application/rss+xml" />
	<link>http://www.linuxany.com</link>
	<description></description>
	<lastBuildDate>Thu, 26 Jan 2012 08:59:02 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.3.1</generator>
		<item>
		<title>Python调用Linux下的动态库(so)</title>
		<link>http://www.linuxany.com/archives/1266.html</link>
		<comments>http://www.linuxany.com/archives/1266.html#comments</comments>
		<pubDate>Sun, 02 May 2010 12:29:07 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[Python]]></category>
		<category><![CDATA[gcc]]></category>
		<category><![CDATA[loadlibrary]]></category>
		<category><![CDATA[so]]></category>

		<guid isPermaLink="false">http://www.linuxany.com/?p=1266</guid>
		<description><![CDATA[1、linuxany.c代码如下： #include &#34;stdio.h&#34; void&#160;display(char* msg){ &#160; &#160; printf(&#34;%s\n&#34;,msg); } &#160; int&#160;add(int a,int b){ &#160; &#160; return&#160;a+b; } 2、编译c代码，最后生成Python可执行的.so文件 （1）gcc -c linuxany.c，将生成一个linuxany.o文件 （2）gcc -shared linuxany.c -o linuxany.so，将生成一个linuxany.so文件 3、在Python中调用 #!/usr/bin/python &#160; from&#160;ctypes import * import&#160;os&#160; //参数为生成的.so文件所在的绝对路径 libtest = cdll.LoadLibrary(os.getcwd() + '/linuxany.so')&#160; //直接用方法名进行调用 print&#160; libtest.display('Hello,I am linuxany.com')&#160; print&#160;libtest.add(2,2010) 4、运行结果 Hello,I am linuxany.com2012 您还可能感兴趣的内容Linux下动态库的生成及链接方法Python 进行DNS解析监控Python 时间戳转换Python 邮件模块小应用Python表单和常用数据验证]]></description>
		<wfw:commentRss>http://www.linuxany.com/archives/1266.html/feed</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
		<item>
		<title>解决Debian5编译环境头文件异常的办法</title>
		<link>http://www.linuxany.com/archives/1227.html</link>
		<comments>http://www.linuxany.com/archives/1227.html#comments</comments>
		<pubDate>Tue, 23 Feb 2010 00:43:44 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[C/C++]]></category>
		<category><![CDATA[Debian]]></category>
		<category><![CDATA[cdt]]></category>
		<category><![CDATA[debian5]]></category>
		<category><![CDATA[ECLIPSE]]></category>
		<category><![CDATA[g++]]></category>
		<category><![CDATA[gcc]]></category>
		<category><![CDATA[include]]></category>

		<guid isPermaLink="false">http://www.linuxany.com/?p=1227</guid>
		<description><![CDATA[在编译时使用下列包含位置即可：（注意顺序） 适用于gcc,g++ 32位： /usr/local/include/usr/lib/gcc/i486-linux-gnu/4.3.2/include/usr/lib/gcc/i486-linux-gnu/4.3.2/include-fixed/usr/include 64位 /usr/local/include/usr/lib/gcc/x86_64-linux-gnu/4.3.2/include/usr/lib/gcc/x86_64-linux-gnu/4.3.2/include-fixed/usr/include 您还可能感兴趣的内容Eclipse + CDT + MinGW + MySQL环境搭建解决方案Debian 无缝升级Debian5至Debian6(不重装系统)Python调用Linux下的动态库(so)Eclipse SVN插件比较 Subclipse vs Subversive[原创]玩转Debian5——安装(LXDE桌面)]]></description>
		<wfw:commentRss>http://www.linuxany.com/archives/1227.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Linux 守护进程的编程方法</title>
		<link>http://www.linuxany.com/archives/859.html</link>
		<comments>http://www.linuxany.com/archives/859.html#comments</comments>
		<pubDate>Sun, 04 Oct 2009 03:44:25 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[C/C++]]></category>
		<category><![CDATA[at]]></category>
		<category><![CDATA[crontab]]></category>
		<category><![CDATA[daemon]]></category>
		<category><![CDATA[gcc]]></category>

		<guid isPermaLink="false">http://www.linuxany.com/?p=859</guid>
		<description><![CDATA[　　守护进程（Daemon）是运行在后台的一种特殊进程。它独立于控制终端并且周期性地执行某种任务或等待处理某些发生的事件。守护进程是一种很有用的进程。Linux的大多数服务器就是用守护进程实现的。比如，Internet服务器inetd，Web服务器httpd等。同时，守护进程完成许多系统任务。比如，作业规划进程crond，打印进程lpd等。 　　守护进程的编程本身并不复杂，复杂的是各种版本的Unix的实现机制不尽相同，造成不同Unix环境下守护进程的编程规则并不一致。这需要读者注意，照搬某些书上的规则（特别是BSD4.3和低版本的System V）到Linux会出现错误的。下面将全面介绍Linux下守护进程的编程要点并给出详细实例。 一． 守护进程及其特性 　　守护进程最重要的特性是后台运行。在这一点上DOS下的常驻内存程序TSR与之相似。其次，守护进程必须与其运行前的环境隔离开来。这些环境包括未关闭的文件描述符，控制终端，会话和进程组，工作目录以及文件创建掩模等。这些环境通常是守护进程从执行它的父进程（特别是shell）中继承下来的。最后，守护进程的启动方式有其特殊之处。它可以在Linux系统启动时从启动脚本/etc/rc.d中启动，可以由作业规划进程crond启动，还可以由用户终端（通常是shell）执行。 　　总之，除开这些特殊性以外，守护进程与普通进程基本上没有什么区别。因此，编写守护进程实际上是把一个普通进程按照上述的守护进程的特性改造成为守护进程。如果读者对进程有比较深入的认识就更容易理解和编程了。 二． 守护进程的编程要点 　　前面讲过，不同Unix环境下守护进程的编程规则并不一致。所幸的是守护进程的编程原则其实都一样，区别在于具体的实现细节不同。这个原则就是要满足守护进程的特性。同时，Linux是基于Syetem V的SVR4并遵循Posix标准，实现起来与BSD4相比更方便。编程要点如下； 1. 在后台运行。 　　为避免挂起控制终端将Daemon放入后台执行。方法是在进程中调用fork使父进程终止，让Daemon在子进程中后台执行。 if(pid=fork()) exit(0);//是父进程，结束父进程，子进程继续 2. 脱离控制终端，登录会话和进程组 　　有必要先介绍一下Linux中的进程与控制终端，登录会话和进程组之间的关系：进程属于一个进程组，进程组号（GID）就是进程组长的进程号（PID）。登录会话可以包含多个进程组。这些进程组共享一个控制终端。这个控制终端通常是创建进程的登录终端。 　　控制终端，登录会话和进程组通常是从父进程继承下来的。我们的目的就是要摆脱它们，使之不受它们的影响。方法是在第1点的基础上，调用setsid()使进程成为会话组长： setsid(); 　　说明：当进程是会话组长时setsid()调用失败。但第一点已经保证进程不是会话组长。setsid()调用成功后，进程成为新的会话组长和新的进程组长，并与原来的登录会话和进程组脱离。由于会话过程对控制终端的独占性，进程同时与控制终端脱离。 3. 禁止进程重新打开控制终端 　　现在，进程已经成为无终端的会话组长。但它可以重新申请打开一个控制终端。可以通过使进程不再成为会话组长来禁止进程重新打开控制终端： if(pid=fork()) exit(0);//结束第一子进程，第二子进程继续（第二子进程不再是会话组长） 4. 关闭打开的文件描述符 　　进程从创建它的父进程那里继承了打开的文件描述符。如不关闭，将会浪费系统资源，造成进程所在的文件系统无法卸下以及引起无法预料的错误。按如下方法关闭它们： for(i=0;i 关闭打开的文件描述符close(i);&#62; 5. 改变当前工作目录 　　进程活动时，其工作目录所在的文件系统不能卸下。一般需要将工作目录改变到根目录。对于需要转储核心，写运行日志的进程将工作目录改变到特定目录如/tmpchdir(&#8216;/&#8217;) 6. 重设文件创建掩模 　　进程从创建它的父进程那里继承了文件创建掩模。它可能修改守护进程所创建的文件的存取位。为防止这一点，将文件创建掩模清除：umask(0); 7. 处理SIGCHLD信号 　　处理SIGCHLD信号并不是必须的。但对于某些进程，特别是服务器进程往往在请求到来时生成子进程处理请求。如果父进程不等待子进程结束，子进程将成为僵尸进程（zombie）从而占用系统资源。如果父进程等待子进程结束，将增加父进程的负担，影响服务器进程的并发性能。在Linux下可以简单地将 SIGCHLD信号的操作设为SIG_IGN。 signal(SIGCHLD,SIG_IGN); 　　这样，内核在子进程结束时不会产生僵尸进程。这一点与BSD4不同，BSD4下必须显式等待子进程结束才能释放僵尸进程。 三． 守护进程实例 　　守护进程实例包括两部分：主程序test.c和初始化程序init.c。主程序每隔一分钟向/tmp目录中的日志test.log报告运行状态。初始化程序中的init_daemon函数负责生成守护进程。读者可以利用init_daemon函数生成自己的守护进程。 1． init.c清单  #include &#60;unistd.h&#62; #include &#60;signal.h&#62; #include &#60;sys/param.h&#62; [...]]]></description>
		<wfw:commentRss>http://www.linuxany.com/archives/859.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Linux下动态库的生成及链接方法</title>
		<link>http://www.linuxany.com/archives/823.html</link>
		<comments>http://www.linuxany.com/archives/823.html#comments</comments>
		<pubDate>Wed, 02 Sep 2009 14:26:03 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[C/C++]]></category>
		<category><![CDATA[a]]></category>
		<category><![CDATA[gcc]]></category>
		<category><![CDATA[libtools]]></category>
		<category><![CDATA[sa]]></category>
		<category><![CDATA[so]]></category>

		<guid isPermaLink="false">http://www.linuxany.com/?p=823</guid>
		<description><![CDATA[Linux下动态库文件的扩展名为”.so”（Shared Object）。按照约定，所有动态库文件名的形式是libname.so（可能在名字中加入版本号）。这样，线程函数库被称作libthread.so。静态库的文件名形式是libname.a。共享archive的文件名形式是libname.sa。共享archive只是一种过渡形式，帮助人们从静态库转变到动态库。 本文仅以简单的例子介绍动态库文件的生成和链接方法。 操作系统：Debian/GNU Linux 2.6.21-2-686; GCC版本：4.1.3 一、库文件及测试文件代码 库文件及测试文件所在的目录：/home/program/。 1.库文件名：myfunction.c /*Author: linuxany */ &#160; #include &#60;stdio.h&#62; int my_lib_function (void) { &#160;&#160; &#160;printf (&#34;Library routine called from libmyfunction.so!\n&#34;); &#160;&#160; &#160;return 0; } 2.测试文件名：test.c #include &#60;stdio.h&#62; int main(void) { &#160;&#160; &#160;my_lib_function(); &#160;&#160; &#160;return 0; } 二、动态库的编译方法 编译库文件myfunction.c: debian:/home/program# gcc -shared -o libmyfunction.so myfunction.c 如果编译成功，会在/home/program/下生成动态库文件：libmyfunction.so。 这里有两点需要说明： 1.对Linux操作，一般都推荐在普通用户模式下，如果需要超级用户的权限，则可以通过su root，输入root用户密码切换。我是个人学习使用，同时又有很多的操作都要使用root用户，因此就直接在root用户下进行编译。 [...]]]></description>
		<wfw:commentRss>http://www.linuxany.com/archives/823.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>GCC 4.x 的新特性</title>
		<link>http://www.linuxany.com/archives/821.html</link>
		<comments>http://www.linuxany.com/archives/821.html#comments</comments>
		<pubDate>Wed, 02 Sep 2009 06:39:57 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[C/C++]]></category>
		<category><![CDATA[gcc]]></category>

		<guid isPermaLink="false">http://www.linuxany.com/?p=821</guid>
		<description><![CDATA[GCC(GNU Compiler Collection) 是 GNU(GNU’s Not Unix) 计划提供的编译器家族，他能够支持 C, C++, Objective-C, Fortran, Java 和 Ada 等等程式设计语言前端，同时能够运行在 x86, x86-64, IA-64, PowerPC, SPARC 和 Alpha 等等几乎现在任何的硬件平台上。鉴于这些特征，连同 GCC 编译代码的高效性，使得 GCC 成为绝大多数免费软件研发编译的最好选择工具。虽然对于程式员们来说，编译器只是个工具，除了研发和维护人员，很少有人关注编译器的发展，但是 GCC 的影响力是如此之大，他的性能提升甚至有望改善任何的免费软件的运行效率，同时他的内部结构的变化也体现出现代编译器发展的新特征，所以 2005年4月20日，GNU 组织发布的 GCC 4.0 引起了广泛的关注。那么这次 GCC 从 3.4.x 直接跃迁到 4.x 的主版本变化到底有什么值得关注的呢？ 我们能够从不同的角度看待 GCC 的这次变迁，对于普通程式员来说，关注的主要是GCC 的前端支持情况连同编译性能的变化。 1. GCC 4.0 的前端支持 GCC 的研发者和使用者当中，大多数人都是 C 或 C++ 的用户，所以 [...]]]></description>
		<wfw:commentRss>http://www.linuxany.com/archives/821.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>GCC之C程序是如何编译成的</title>
		<link>http://www.linuxany.com/archives/784.html</link>
		<comments>http://www.linuxany.com/archives/784.html#comments</comments>
		<pubDate>Sat, 15 Aug 2009 11:06:27 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[C/C++]]></category>
		<category><![CDATA[c]]></category>
		<category><![CDATA[gcc]]></category>
		<category><![CDATA[helloworld]]></category>
		<category><![CDATA[make]]></category>
		<category><![CDATA[makefile]]></category>

		<guid isPermaLink="false">http://www.linuxany.com/?p=784</guid>
		<description><![CDATA[在windows环境，我们有集成开发环境（IDE），使得我们对编译器了解的很少。当我们专向linux时需要在命令行下编译自己的程序需要对编译器的 命令行参数比较熟悉。而如果是做嵌入开发构建自己的操作系统时失去了系统平台，需要我们对编译的过程以及可执行文件的内部结构有所了解。本文讲述了如何编 译可执行文件、静态库、动态库，如何优化编译器，如何编译无操作系统环境下的程序（自己的OS）等。 1.分析普通的helloworld程序 先书写一下一个简单的helloworld程序如下： /* hello.c */ int main(int argc, char * argv[]) { &#160; &#160; return&#160;0 } 编译程序： gcc -o hello hello.c 等价的编译方法： gcc -c hello.cgcc -o hello.my -nostartfiles hello.o /usr/lib/crt1.o /usr/lib/crti.o /usr/lib/crtn.o 我在redflag workstation 5.0版本下用3.4.3版本GCC编译器编译出来的大小都是3589字节，并且用diff命令比较为相同的文件。由此证明gcc在编译并链接 hello.c文件时先将hello.c编译成hello.o，然后将它与crt1.o、crti.o、crtn.o链接在一起。 如果要写一个没有main函数的程序，就需要自己实现crt1.o。程序入口为符号“_start”处。代码如下： /* nomain.c */ void _start(void) { &#160; &#160; _exit(0); } gcc -o nomain -nostartfiles hello.c [...]]]></description>
		<wfw:commentRss>http://www.linuxany.com/archives/784.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>

