addln 是什么ln 文件夹链接

23031人阅读
Linux+C(6)
Makefile.am是一种比Makefile更高层次的编译规则,可以和configure.in文件一起通过调用automake命令,生成Makefile.in文件,再调用./configure的时候,就将Makefile.in文件自动生成Makefile文件了。所以Makefile.am文件是比Makefile文件更高的抽象。
下面我根据自己的工作中的一些应用,来讨论Makefile.am的编写。我觉得主要是要注意的问题是将编译什么文件?这个文件会不会安装?这个文件被安装到什么目录下?可以将文件编译成可执行文件来安装,也可以编译成静态库文件安装,常见的文件编译类型有下面几种:
PROGRAMS。表示可执行文件LIBRARIES。表示库文件LTLIBRARIES。这也是表示库文件,前面的LT表示libtool。HEADERS。头文件。SCRIPTS。脚本文件,这个可以被用于执行。如:example_SCRIPTS,如果用这样的话,需要我们自己定义安装目录下的example目录,很容易的,往下看。DATA。数据文件,不能执行。
一,可执行文件
先看一个实例:
bin_PROGRAMS = client
client_SOURCES = key.c connect.c client.c main.c session.c hash.c
client_CPPFLAGS = -DCONFIG_DIR=\&$(sysconfdir)\& -DLIBRARY_DIR=\&$(pkglibdir)\&
client_LDFLAGS = -export-dynamic -lmemcached
noinst_HEADERS = client.h
INCLUDES = -I/usr/local/libmemcached/include/
client_LDADD = $(top_builddir)/sx/libsession.la \
$(top_builddir)/util/libutil.la上面就是一个全部的Makefile.am文件,这个文件用于生成client可执行应用程序,引用了两个静态库和MC等动态库的连接。分析一下:
bin_PROGRAMS:表示指定要生成的可执行应用程序文件,这表示可执行文件在安装时需要被安装到系统中,如果只是想编译。不想被安装到系统中,可以用noinst_PROGRAMS来代替。
一个简单的问题是:bin_PROGRAMS=client 这一行表示什么意思?解释如下:
PROGRAMS知道这是一个可执行文件。client表示编译的目标文件。bin表示目录文件被安装到系统的目录。
后面的包括头文件,静态库的定义都是这种形式,如lib_LIBRARIES=util,表示将util库安装到lib目录下。继续解释上面的文件
client_SOURCES:表示生成可执行应用程序所用的源文件,这里注意,client_是由前面的bin_PROGRAMS指定的,如果前面是生成example,那么这里就是example_SOURCES,其它的类似标识也是一样。
client_CPPFLAGS:这和Makefile文件中一样,表示C语言预处理器参数,这里指定了DCONFIG_DIR,以后在程序中,就可以直接使用CONFIG_DIR,不要把这个和另一个CFLAGS混淆,后者表示编译器参数。
client_LDFLAGS:这个表示在连接时所需要的库文件选项标识。这个也就是对应一些如-l,-shared等选项。
noinst_HEADERS:这个表示该头文件只是参加可执行文件的编译,而不用安装到安装目录下。如果需要安装到系统中,可以用include_HEADERS来代替。
INCLUDES:连接时所需要的头文件。
client_LDADD:连接时所需要的库文件,这里表示需要两个库文件的支持,下面会看到这个库文件又是怎么用Makefile.am文件后成的。
再谈谈关于上文中的全局变量引用,可能有人注意到$(top_builddir)等全局变量(因为这个文件之前没有定义),其实这个变量是Makefile.am系统定义的一个基本路径变量,表示生成目标文件的最上层目录,如果这个Makefile.am文件被其它的Makefile.am文件,这个会表示其它的目录,而不是这个当前目录。还可以使用$(top_srcdir),这个表示工程的最顶层目录,其实也是第一个Makefile.am的入口目录,因为Makefile.am文件可以被递归性的调用。
下面再说一下上文中出现的$(sysconfdir),在系统安装时,我们都记得先配置安装路径,如./configure --prefix=/install/apache 其实在调用这个之后,就定义了一个变量$(prefix),表示安装的路径,如果没有指定安装的路径,会被安装到默认的路径,一般都是/usr/local。在定义$(prefix),还有一些预定义好的目录,其实这一些定义都可以在顶层的Makefile文件中可以看到,如下面一些值:
bindir = $(prefix)/bin。
libdir = $(prefix)/lib。
datadir=$(prefix)/share。
sysconfdir=$(prefix)/etc。
includedir=$(prefix)/include。
这些量还可以用于定义其它目录,例如我想将client.h安装到include/client目录下,这样写Makefile.am文件:
clientincludedir=$(includedir)/client
clientinclude_HEADERS=$(top_srcdir)/client/client.h这就达到了我的目的,相当于定义了一个安装类型,这种安装类型是将文件安装到include/client目录下。
我们自己也可以定义新的安装目录下的路径,如我在应用中简单定义的:
devicedir = ${prefix}/device
device_DATA = package这样的话,package文件会作为数据文件安装到device目录之下,这样一个可执行文件就定义好了。注意,这也相当于定义了一种安装类型:devicedir,所以你想怎么安装就怎么安装,后面的XXXXXdir,dir是固定不变的。
二,静态库文件
编译静态库和编译动态库是不一样的,我们先看静态库的例子,这个比较简单。直接指定 XXXX_LTLIBRARIES或者XXXX_LIBRARIES就可以了。如果不需要安装到系统,将XXXX换成noinst就可以。还是再罗嗦一下:
一般推荐使用libtool库编译目标,因为automake包含libtool,这对于跨平台可移植的库来说,肯定是一个福音。
看例子如下:
noinst_LTLIBRARIES = libutil.la
noinst_HEADERS = inaddr.h util.h compat.h pool.h xhash.h url.h device.h
libutil_la_SOURCES = access.c config.c datetime.c hex.c inaddr.c log.c device.c pool.c rate.c sha1.c stanza.c str.c xhash.c
libutil_la_LIBADD = @LDFLAGS@
第一行的noinst_LTLIBRARIES,这里要注意的是LTLIBRARIES,另外还有LIBRARIES,两个都表示库文件。前者表示libtool库,用法上基本是一样的。如果需要安装到系统中的话,用lib_LTLIBRARIES。
注意:静态库编译连接时需要其它的库的话,采用XXXX_LIBADD选项,而不是前面的XXXX_LDADD。编译静态库是比较简单的,因为直接可以指定其类型。
三,动态库文件
想要编译XXX.so文件,需要用_PROGRAMS类型,这里一个关于安装路径要注意的问题是,我们一般希望将动态库安装到lib目录下,按照前面所讨论的,只需要写成lib_PROGRAMS就可以了,因为前面的lib表示安装路径,但是automake不允许这么直接定义,可以采用下面的办法,也是将动态库安装到lib目录下
projectlibdir=$(libdir) //新建一个目录,就是该目录就是lib目录
projectlib_PROGRAMS=project.so
project_so_SOURCES=xxx.C
project_so_LDFLAGS=-shared -fpic //GCC编译动态库的选项这个动态库我没有测试,在网上找的一些资料,然后整理的。
四,SUBDIRS的用法
这是一个很重要的关键词,我们前面生成了一个一个的目标文件,但是一个大型的工程项目是由许多个可执行文件和库文件组成,也就是包含多个目录,每个目录下都有用于生成该目录下的目标文件的Makefile.am文件,但顶层目录是如何调用,才能使下面各个目录分别生成自己的目标文件呢?就是SUBDIRS关键词的用法了。
看一下我的工程项目,这是顶层的Makefile.am文件
EXTRA_DIST = Doxyfile.in README.win32 README.protocol contrib UPGRADE
devicedir = ${prefix}/device
device_DATA = package
SUBDIRS = etc man
if USE_LIBSUBST
SUBDIRS += subst
SUBDIRS += tools io sessions util client dispatch server hash storage smsSUBDIRS表示在处理目录之前,要递归处理哪些子目录,这里还要注意处理的顺序。比如我的client对sessions和utils这两上目标文件有依赖,就在client之前需要处理这两个目标文件。
EXTRA_DIST:将哪些文件一起打包。
五,关于打包
Automake会自动的打包,自动打包的内容如下:
所有源文件。所有的Makefile.am文件。configure读取的文件。Makefile.am中包含的文件。EXTRA_DIST指定的文件。
采用dist及nodist指定的文件,如可以将某一源文件指定为不打包:
nodist_client_SOURCES = client.c
六,完成之前
基本上我介绍的都是我实际工作中所用的实例,GNU automake工具包含的东西,完不止这些。我介绍的过程也是我所认识的和参考的一些我所理解的,欢迎大家指出不足。
参考知识库
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
(1)(10)(13)(59)Related Terms
(1) A component you can add to a
to increase its capabilities. Add-ins can increase
capabilities to a computer. They can come in the form of , , or . The term add-in is often used instead of
for chips you add to a
that is already installed in a computer. In contrast, add-on almost always refers to an entire .
that extends the capabilities of larger programs. For example, there are many Excel add-ins designed to complement the basic functionality offered by Excel. In the
, add-ins are becoming increasingly common thanks to .
(3) In , add-in refers specifically to the supplemental programs that users can install to extend the capabilities of the
program. Most add-ins are third party or community developed.
Related Links
TECH RESOURCES FROM OUR PARTNERS
WEBOPEDIA WEEKLY
Stay up to date on the latest developments in Internet terminology with a free weekly newsletter from Webopedia. Join to subscribe now.
LATEST ARTICLES
Like everything in technology, AI touches on so many other trends, like self-driving cars and automation, and Big Data and the Internet of Things...
As organizations rush to release new applications, security appears to be getting short shrift. DevSecOps is a new approach that holds promise.
This slideshow reviews five easy on-page editorial SEO tips to help drive organic search engine traffic, including the page title, heading,...
STUDY GUIDES
Java is a high-level programming language. This guide describes the basics of Java, providing an overview of syntax, variables, data types and...
This second Study Guide describes the basics of Java, providing an overview of operators, modifiers and control Structures.
The Open System Interconnection (OSI) model defines a networking framework to implement protocols in seven layers. Use this handy guide to compare...ERP克隆步骤_百度文库
两大类热门资源免费畅读
续费一年阅读会员,立省24元!
ERP克隆步骤
上传于||暂无简介
阅读已结束,如果下载本文需要使用0下载券
想免费下载更多文档?
定制HR最喜欢的简历
下载文档到电脑,查找使用更方便
还剩1页未读,继续阅读
定制HR最喜欢的简历
你可能喜欢下次自动登录
现在的位置:
& 综合 & 正文
Arcgis Add-In开发入门实例
作为一个本科侧重于应用,工作之后却做了开发的员来说,做GIS,开发应该是一门必修课,只是,苦于各种原因吧,做GIS应用的人会开发的很少,做GIS开发的大部分都是计算机出身,痛心疾首啊……
不好意思,刚开始,就唠叨两句,还望大家见谅。在Arcgis10的版本之后,ESRI公司推出了很方便的Add-In插件式开发,下面就Add-In做一个简单的介绍:
Add-In是一种能够快速扩展桌面应用程序功能的全新扩展方式。
作为ArcGIS 10中全新定制方法,它有以下特点:
(1)容易创建:ArcGIS提供了很多创建Add-In模板,并提供了详细的接口以实现各种功能。
(2)更易共享:Add-In本质上是一个Zip压缩文件这个压缩文件里面包含了,易于网络、邮件传输、易于局域网内共享。
(3)更加安全:可以对Add-In文件进行数字签名,使用的安全性得到保障。
(4)更易安装管理:只要安装有桌面软件,系统就能自动识别Add-In文件,双击即可安装部署,同时desktop也有用于管理Add-In的管理工具。
ArcGISAdd-In支持的类型
按钮和工具
菜单和右键菜单
Multi-items
Tool palettes
可停靠窗体
Application extensions
Editor extensions
在做Add-In开发需要安装ArcObjects for .net的开发包。下面就详细的介绍一个简单的例子:在Arcmap界面添加一个按钮,按钮对应的事件为添加shp数据。
1、开发环境
Vs2010+Arcgis10.0+win8 64bit
首先在VS2010中新建一个解决方案,命名AddInTest。
接着,给解决方案AddInTest新建一个项目:
点击[确定],出现如下界面,直接点击[finish]。
接着,给项目ArcMapAddinTest新建一个项目
点击[添加],设置相关信息,并点击[finish]完成。
上图中,class name是类的名称,caption是button显示的文字,category是所属的command的分类,tooltip是鼠标在上面时状态栏显示的文字,description是工具的描述。
项目建成后,文件组织如下图:
Config.esriaddinx是一个XML文件,是一个配置文件,里面包含了项目的相关配置,是自动生成的,内容如下:
&ESRI.Configuration xmlns="/Desktop/AddIns" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"&
&Name&ArcMapAddinTest&/Name&
&AddInID&{0f7ec41b-d1e3--9dea10bea621}&/AddInID&
&Description&Type in a description for this Add-in.&/Description&
&Version&1.0&/Version&
&Image&Images\ArcMapAddinTest.png&/Image&
&Author&Administrator&/Author&
&Company&&/Company&
&Date&&/Date&
&Target name="Desktop" version="10.0" /&
&/Targets&
&AddIn language="CLR" library="ArcMapAddinTest.dll" namespace="ArcMapAddinTest"&
&Commands&
&Button id="ArcMapAddinTest_AddShp" class="AddShp" message="点击浏览shp文件并添加" caption="AddShp" tip="实现添加shp文件的功能" category="Add-In Controls" image="Images\AddShp.png" /&
&/Commands&
&/ESRI.Configuration&
新建完成之后,addshp的内容如下:
using System.Collections.G
using System.T
using System.IO;
namespace ArcMapAddinTest
public class AddShp : ESRI.ArcGIS.Desktop.AddIns.Button
public AddShp()
protected override void OnClick()
protected override void OnUpdate()
里面包含两个方法,onclick和onupdate方法。onclick方法是点击按钮时,我们在里面写添加shp文件的代码。
首先,添加如下引用:
using System.Windows.F
using ESRI.ArcGIS.ArcMapUI;
using ESRI.ArcGIS.C
using ESRI.ArcGIS.G
using ESRI.ArcGIS.G
using ESRI.ArcGIS.DataSourcesF
onclick方法里,事件的实现代码如下:
IMxDocument pM
public Button1()
pMxd = ArcMap.Document as IMxD
protected override void OnClick()
System.Windows.Forms.OpenFileDialog openFileDialog = new System.Windows.Forms.OpenFileDialog();
openFileDialog.Filter = "shp(*.shp)|*.shp";
openFileDialog.InitialDirectory = @"D:\";
openFileDialog.Multiselect =
DialogResult pDialogResult = openFileDialog.ShowDialog();
if (pDialogResult != DialogResult.OK)
string pPath = openFileDialog.FileN
string pFolder = System.IO.Path.GetDirectoryName(pPath);
string pFileName = System.IO.Path.GetFileName(pPath);
IWorkspaceFactory pWorkspaceFactory = new ShapefileWorkspaceFactory();
IWorkspace pWorkspace = pWorkspaceFactory.OpenFromFile(pFolder, 0);
IFeatureWorkspace pFeatureWorkspace = pWorkspace as IFeatureW
IFeatureClass pFC = pFeatureWorkspace.OpenFeatureClass(pFileName);
IFeatureLayer pFLayer = new FeatureLayerClass();
pFLayer.FeatureClass = pFC;
pFLayer.Name = pFC.AliasN
ILayer pLayer = pFLayer as IL
IMap pMap = pMxd.FocusM
pMap.AddLayer(pLayer);
TODO: Sample code showing how to access button host
ArcMap.Application.CurrentTool =
OnUpdate方法事件的代码如下:
protected override void OnUpdate()
Enabled = pMxd.FocusMap.LayerCount &= 0;
代码编写完成后,编译程序,打开编译目录,编译文件如下:
双击.esriAddIn文件,添加工具到Arcmap中。打开Arcmap,打开扩展管理,command选项卡,找到Add-In Controls,这时候你会发现你编写的工具会出现在这一组里面。
点击[close],点点试试……
&&&&推荐文章:
【上篇】【下篇】

我要回帖

更多关于 linux ln 文件夹 的文章

 

随机推荐