热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

NetBean远程开发的好文1NetBeans的远程LinuxC开发实践

from:http:blog.csdn.netjacktanarticledetails9268535一直以来总觉得NetBeans生活在Eclipse的阴影下,同样

from:  http://blog.csdn.net/jacktan/article/details/9268535

 

一直以来总觉得NetBeans生活在Eclipse的阴影下,同样做为一款不错的基于Java开发的IDE却走着完全不同的发展道路。可能是由于之前我一直较多的使用Java的缘故,所以Eclipse一直是我最为常用的工具。偶尔我也会尝鲜一下NetBeans,但是总觉得使用习惯上有点别扭。不过由于工作的需要,开始更多的接触Linux C,Eclipse CDT就显得越来越苍白。毕竟Cygwin和真正的Linux还是有很大差异的,写一个简单的C程序Cygwin可以应付,但是对于一个较大的C程序且需要非常复杂的环境时,Cygwin就明显的力不从心了。于是乎就开始寻找其他的解决方案......。

在网上搜索了相关的技术类文章,说实话,90%的文章内容相仿,或是抄来抄去,或是浅尝即止。大部分内容均来自官网手册,而使用的例子也是“Hello World”型的,毫无实用价值。做为一名“骑自行车”的架构师,有责任写一篇系统的,图文并茂的总结性文章,给所有有类似需要的同学提供一个有价值的参考。

闲话少说,先来介绍一下我们的环境和此次演示的例程:

环境:

本机环境为windows7,NetBeans7.3.1,Java1.6(NetBeans运行需要Java环境)。

远程主机为RHEL5.8 64位,SSH,Oracle数据库11.2.0,Oracle客户端11.2.0,GCC4.1.2,安装了所有C/C++开发包,编译安装ocilib3.12.1。

演示例程:

本次我们演示的例程是开发一个访问Oracle数据库的C程序,它需要访问一个第三方的函数库(ocilib),并且依赖Oracle客户端。

之所以采用这个例程主要出于如下几个目的:

1. 了解C访问Oracle数据库的其他方式(之前我们一般都使用PRO*C的方式);

2. 了解如何在远程模式下compile源代码;

3. 了解如何在远程模式下linked第三方函数库;

4. 了解如何在远程模式下进行Debug;

以上几个知识点基本上涵盖了日常开发中所需掌握的大部分技能(我指的仅限于开发工具的使用技能,至于编程技能因人而异了)。

一. 配置NetBeans远程开发环境

这部分确实很乏味,因为官网上已经有很详细的介绍了(中英文版都有),且网上也有一群人在不停的复制拷贝把自己当成复印机,所以我实在没必要再拷贝一遍。这里我提供一个链接:https://netbeans.org/kb/docs/cnd/remotedev-tutorial_zh_CN.html,如果不知道如何配置的同学可以先去了解一下。

最后提供一下我自己本机上的配置结果截图,可做为一个参照系:

这里在唠叨几句,同学们可能看到那个图标是红色的,和上面的"localhost"的图标不一样,这是因为这个远程主机尚未连接,你可以通过在这个主机上单击右键,并选择“连接”命令来连接远程主机,如果连接成功图标就会变成绿色了。另外这里还会列出我远程主机上的工具链,有gcc, g++,make和gdb等,有了这些工具我们才能进行远程开发和调试。

NetBeans还提供了问题跟踪器(JIRA)和Hudson构建器服务,这 2个服务对我们日常的开发也大有帮助,至少我在Eclipse上没有发现这些有用的工具(可能是我孤陋寡闻)。

二. 准备远程主机开发环境

远程主机上需要安装Oracle数据库,当然还有Oracle数据库客户端(需要oci.h头文件和libclntsh.so动态库以及TNS的配置),这些环境的安装和配置如果要写又是上W字,估计写了你也不会去看,所以如果您对此还不甚了解,那就去google一下吧,相关的文章多的是(判断一个Oracle客户端是否安装成功,只要执行一下sqlplus命令并且可以连接Oracle数据库且可执行select语句即可)。

我这里想介绍一下ocilib函数库的编译安装。这个函数库是对OCI的一个封装,提供了非常友好的API接口,如果你熟悉JDBC,那你会觉得它很亲切。从http://sourceforge.net/projects/orclib上下载最新的版本,并解压缩到远程主机上。网上有些文章写的有点问题,编译参数不太一样,我的编译参数如下:

 

[plain] view plaincopy
  1. ./configure --prefix=/usr/local/ocilib --with-oracle-lib-path=/u01/app/oracle/product/11.2.0/db_1/lib --with-oracle-headers-path=/u01/app/oracle/product/11.2.0/db_1/rdbms/public  
  2. make && make install  


我是将其安装在/usr/local/ocilib目录中,并且一定要指定oracle的lib目录和头文件所在的目录,否则编译不通过。

 

当编译完成之后,会产生ocilib的头文件和相关的链接库,如下所示:

头文件目录及头文件。

动态库和静态库文件。

至此,我们的第三方函数库编译安装完成,接下去可以在本机上开发源代码了。

三. 在本机上编写源代码

最让人兴奋的环节到来了,终于可以写代码了。在NetBeans中新建一项目,选择项目类别为“C/C++应用程序”,然后点击下一步,如下图所示:

在第二个对话框中输入项目名称,项目位置,构建主机等信息,如下图所示:

最新点击完成,新建项目完成。如下图所示:

我们打开main.c文件,开始编写代码,如下所示:

 

[cpp] view plaincopy
  1. /*  
  2.  * File:   main.c 
  3.  * Author: Administrator 
  4.  * 
  5.  * Created on 2013年7月5日, 下午5:32 
  6.  */  
  7.   
  8. #include   
  9. #include   
  10. #include   
  11.   
  12. /* 
  13.  *  
  14.  */  
  15. int main(int argc, char** argv) {  
  16.     OCI_Connection *cn;  
  17.     OCI_Statement *st;  
  18.     OCI_Resultset *rs;  
  19.   
  20.     //init instance  
  21.     if (!OCI_Initialize(NULL, NULL, OCI_ENV_DEFAULT | OCI_ENV_CONTEXT)) {  
  22.         printf("OCI_Initialize failure!\n");  
  23.         return EXIT_FAILURE;  
  24.     }  
  25.   
  26.     cn = OCI_ConnectionCreate("STOREVM", "username", "password",  
  27.             OCI_SESSION_DEFAULT);  
  28.     if (!cn) {  
  29.         printf("OCI_ConnectionCreate failure!\n");  
  30.         return EXIT_FAILURE;  
  31.     }  
  32.   
  33.     st = OCI_StatementCreate(cn);  
  34.     if (!st) {  
  35.         printf("OCI_StatementCreate failure!\n");  
  36.         return EXIT_FAILURE;  
  37.     }  
  38.   
  39.     OCI_ExecuteStmt(st, "select * from test t");  
  40.   
  41.     rs = OCI_GetResultset(st);  
  42.   
  43.     while (OCI_FetchNext(rs))  
  44.         printf("table.name: %s, PK.name %s\n", OCI_GetString(rs, 1),  
  45.             OCI_GetString(rs, 2));  
  46.   
  47.     printf("\n%d row(s) fetched\n", OCI_GetRowCount(rs));  
  48.   
  49.     OCI_Cleanup();  
  50.   
  51.     return EXIT_SUCCESS;  
  52. }  

可能IDE会提示找不到ocilib.h文件,因为没有把ocilib的include路径包含进来。我们可以点击“工具”菜单并选择“选项”菜单项,在弹出的对话框中选择“C/C++”选项卡,如下图所示:

 

在“代码帮助”选项卡中,首先在“工具集合”下拉框中选择我们定义的远程主机,然后再“C 编译器”选项卡中点击“添加”按钮,这时会显示远程主机的目录结构,接着选择ocilib的include路径,比如我远程主机上的路径是“/usr/local/ocilib/inculde”,完成之后点击确定按钮。这时就不会再提示找不到ocilib.h头文件了。我们也可以通过此方法将其他函数库的头文件引进来(这个方法解决了在本地IDE中引入远程主机上头文件的问题)。

四. 编译及链接

代码写好了,开始编译代码,点击工具栏上“构建项目”按钮,如下图所示:

悲剧!编译失败了,提示找不到ocilib.h文件。如下图所示:

之前我们不是已经将ocilib.h头文件引入进来吗?这么还说没找到呢?其实这是两个概念,之前引入的只是代码帮助的功能,此功能提供了我们可以在IDE中浏览头文件的内容,而现在是在远程主机上编译源代码,说白了,就是我们遗漏了GCC编译参数。好吧,让我们继续。

在项目中点击右键,在上下文菜单中选择“属性”,会弹出一个项目属性对话框,如下图所示:

在构建下我们选择“C编译器”,然后在 右边的“包含目录”项中填写远程主机上ocilib的include路径(如果是多个目录,每个目录之间用分号隔开)。最后点击确定按钮。当然此处还有其他一些GCC的编译参数可供选择,按照自己的实际情况加以选择即可。这里建议把“警告级别”替换成“更多警告”或“将警告替换成错误”选项。

好了,我们再次点击工具栏上的“构建项目”按钮。这次编译总算过了,但是在连接ocilib动态库的时候报错了,如下图所示:

这是明显的未连接到动态库的错误,好吧,继续打开项目属性对话框,如下图所示:

在构建的下面我们选择“链接器”,然后在右面的“其他库目录”中填写远程主机上的ocilib的lib目录路径(如果有多个目录,每个目录之间用分号隔开)。接着我们在“库”这项中点击右边的按钮,会弹出一个库对话框,如下图所示:

由于我们要选择远程的函数库,所以只能选择“添加选项”按钮,在弹出的对话框中,选择“其他选项”并填写指定库的参数,如上图中所示。通过这种方法,我们就可以解决gcc编译链接远程主机上任意函数库的问题。我们不再需要在本机上安装gcc的仿真linux环境了,比如:Cygwin等。

完成之后点击一连串的确定按钮,再次的点击工具栏上的“构建项目”按钮,这次编译链接都成功完成了,如下图所示:

从上图中,我们还能发现,远程主机上同时生成了可执行文件的路径:/root/.netbeans/remote/www.storevm.org/zgc-20130102uwx-Windows-x86/D/CPRO/ocilib_test。你可以到远程主机上去检查一下,看看是否存在这个文件(至于这是通过什么工作机制实现的,请参考官网介绍,我这里就不再赘述了)。

五. 代码运行与调试

编译链接都OK了,可以执行程序了,我们先创建一张表,表名为test,表中有2个字段,都是varchar2类型的,最后在insert一些测试数据。点击工具栏上的“运行项目”按钮,在IDE的输出控制台输出了表中的3行记录,程序执行成功,如下图所示:

以下是我们实际表中的记录(通过PL/SQL):

程序执行的结果和SQL执行的结果完全相同。

至此,所有开发全部完成。接下去我们来玩玩远程主机的调试,其实NetBeans的远程主机调试和在本地调试的操作步骤完全一样。打上断点,然后点击“调试项目”按钮,最后按F6键进行单步调试。如下图所示:

可通过调试工具栏上的按钮进行单步,步入,步出等Debug操作。感觉上和在本地调试程序完全一样。有一点要注意,就是不要在项目路径中包含中文字符,否则无法启动远程调试程序。

我想讲述的内容就这些了,写到这里,突然有些感想,记得十几年前,在那IDE匮乏的年代,基本上都是靠记事本或是vim等工具来编写C代码,然后再FTP到Linux下编译运行调试。有时为了调试一个很难发现的bug不得不在代码中加上一大堆的printf函数。或许直至今日你仍然看不起那些用IDE写代码的人,或许那些刚入公司的80,90后正在用崇拜的眼光看着你飞速的在记事本上敲入代码而让你沾沾自喜,又或许你会用100种理由在论坛上大谈徒手代码的优势。的确,你很牛逼,我也由衷的崇拜你这种毅力。不过做为技术人员我们应该拥抱变化,接受变化。应该始终的站在技术的前沿阵地。技术人员只能向前看,不能原地看,更不能回头看,那只会制约我们的发展。中国人墨守成规是上千年来的积习,但是搞技术的人不能墨守,否则我们永远都只会模仿,山寨!那些仍然还在记事本上写代码人们,希望我的这篇文章或许给你一点微不足道的启示!



推荐阅读
  • PostgreSQL 最新动态 —— 2022年4月6日
    了解 PostgreSQL 社区的最新进展和技术分享 ... [详细]
  • 本文详细介绍了优化DB2数据库性能的多种方法,涵盖统计信息更新、缓冲池调整、日志缓冲区配置、应用程序堆大小设置、排序堆参数调整、代理程序管理、锁机制优化、活动应用程序限制、页清除程序配置、I/O服务器数量设定以及编入组提交数调整等方面。通过这些技术手段,可以显著提升数据库的运行效率和响应速度。 ... [详细]
  • Java项目分层架构设计与实践
    本文探讨了Java项目中应用分层的最佳实践,不仅介绍了常见的三层架构(Controller、Service、DAO),还深入分析了各层的职责划分及优化建议。通过合理的分层设计,可以提高代码的可维护性、扩展性和团队协作效率。 ... [详细]
  • 智能医疗,即通过先进的物联网技术和信息平台,实现患者、医护人员和医疗机构之间的高效互动。它不仅提升了医疗服务的便捷性和质量,还推动了整个医疗行业的现代化进程。 ... [详细]
  • ThinkPHP 数据库配置详解
    本文详细介绍了如何在 ThinkPHP 框架中正确配置数据库连接参数,包括数据库类型、服务器地址、数据库名称等关键配置项。 ... [详细]
  • Python 工具推荐 | PyHubWeekly 第二十一期:提升命令行体验的五大工具
    本期 PyHubWeekly 为大家精选了 GitHub 上五个优秀的 Python 工具,涵盖金融数据可视化、终端美化、国际化支持、图像增强和远程 Shell 环境配置。欢迎关注并参与项目。 ... [详细]
  • 并发编程 12—— 任务取消与关闭 之 shutdownNow 的局限性
    Java并发编程实践目录并发编程01——ThreadLocal并发编程02——ConcurrentHashMap并发编程03——阻塞队列和生产者-消费者模式并发编程04——闭锁Co ... [详细]
  • 优化SQL Server批量数据插入存储过程的实现
    本文介绍了一种改进的SQL Server存储过程,用于生成批量插入语句。该方法不仅提高了性能,还支持单行和多行模式,适用于SQL Server 2005及以上版本。 ... [详细]
  • 本文探讨了现代分布式架构的多样性,包括高并发、多活数据中心、容器化、微服务、高可用性和弹性架构等,并介绍了与这些架构相关的重要管理技术,如DevOps、应用监控和自动化运维。文章还深入分析了分布式系统的核心概念、主要用途及类型,同时对比了单体应用与分布式服务化的优缺点。 ... [详细]
  • 最新计算机专业原创毕业设计参考选题都有源码+数据库是近期作品ling取参考你的选题刚好在下面有,有时间看到机会给您发1ssm资源循环利用2springboot校园考勤系统3ssm防 ... [详细]
  • 本文探讨了2019年前端技术的发展趋势,包括工具化、配置化和泛前端化等方面,并提供了详细的学习路线和职业规划建议。 ... [详细]
  • 本月初,我们为大家推荐了一系列精选书单,助力大家提升技术水平。月底,我们将介绍几位行业大牛,帮助大家找到人生导师。InfoQ一直致力于为用户提供有价值的资源和支持。 ... [详细]
  • 1.执行sqlsever存储过程,消息:SQLServer阻止了对组件“AdHocDistributedQueries”的STATEMENT“OpenRowsetOpenDatas ... [详细]
  • Java多重继承的替代方案及设计考量
    本文探讨了Java为何不支持多重继承,并深入分析了其背后的原理和替代方案。通过理解Java的设计哲学,开发者可以更好地利用接口和其他特性来实现复杂的类结构。 ... [详细]
  • CentOS 7.2 配置防火墙端口开放
    本文介绍如何在 CentOS 7.2 系统上配置防火墙以开放特定的服务端口,包括 FTP 服务的临时与永久开放方法,以及如何验证配置是否生效。 ... [详细]
author-avatar
风冷泻千山
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有