草庐IT

Linux ar命令(更改静态库相关属性信息)

sky_share 2023-04-09 原文

库:为减少编程时程序代码的开发量,一般会按照软件重用思想将经常使用的功能模块封装成库,而对库文件进行操作一般会使用Linux中的ar命令。

ar命令基本用法:

ar命令可以用来创建、修改库,也可以从库中提出单个模块。库是一单独的文件,里面包含了按照特定的结构组织起来的其它的一些文件(称做此库文件的member)。原始文件的内容、模式、时间戳、属主、组等属性都保留在库文件中。

 例如我们可以用ar rv liba.a a.o b.o来
生成一个库,库名为a,链接时可以用-ltest链接。该库中存放了两个模块a.o和b.o。选项前的‘-'字符可有可无。ar命令选项可分为操作选项和任选项,现把{dmpqrtx}部分称为操作选项,而[abcDfilMNoPsSTuvV]部分称为任选项。
补充说明:ar可集合许多文件,成为单一的备存文件;在备存文件中,所有成员文件皆保有原来的属性与权限。

命令:
  d - 从存档中删除文件
  m[ab] - 移动档案中的文件
  p - 在存档中找到的打印文件
  q[f] - 快速追加文件到存档
  r[ab][f][u] - 替换现有文件或将新文件插入存档
  s - 充当ranlib
  t - 显示档案的内容
  x[o] - 从存档中提取文件
 命令特定修饰符:
  [a] - 将文件放在 [member-name] 之后
  [b] - 将文件放在 [member-name] 之前(与 [i] 相同)
  [D] - 对时间戳和 uids/gids 使用零(默认)
  [U] - 使用实际时间戳和 uids/gids
  [N] - 使用名称的实例 [count]
  [f] - 截断插入的文件名
  [P] - 匹配时使用完整路径名
  [o] - 保留原始日期
  [u] - 仅替换比当前存档内容更新的文件
 通用修饰符:
  [c] - 如果必须创建库,则不发出警告
  [s] - 创建存档索引(参见 ranlib)
  [S] - 不建立符号表
  [T] - 制作精简档案
  [v] - 冗长
  [V] - 显示版本号
  @<file> - 从 <file> 读取选项
  --target=BFDNAME - 指定目标对象格式为 BFDNAME
 可选的:
  --plugin <p> - 加载指定插件
仿真选项:
  没有仿真特定选项

ar用来管理一种文档,这种文档中可以包含多个其他任意类别的文件。这些被包含的文件称为这个文档的成员。ar可以向这种文档中添加、删除、解出成员。成员的原有属性(权限、属主、日期等)不会丢失。

在实际编程开发中,只有开发的目标连接库是这种格式的,尽管并未明确说明,基本可以认定ar是用来操作目标链接库(.a文件)的。

1、创建库文件

通常使用“ar cru liba.a a.o"命令来创建一个库并把a.o添加进去。"c"关键字告诉ar需要创建一个新库文件,如果没有指定这个标志则ar会创建一个文件,同时会给出 一个提示信息;"u"用来通知ar如果a.o比库中的同名成员要新,则用新的a.o替换原来的。但是我发现这个参数也是可有可无的,可能是不同版本的ar 行为不一样吧。实际上用"ar -r liba.a a.o"在freebsd5上面始终可以成功。

2、添加新成员

"ar -r liba.a b.o" ;即可将b.o加入到liba.a中。默认的加入方式为append,即加在库的末尾。"r"关键字可以有三个修饰符"a", "b"和"i"。

  • "a":表示after,即将新成员加在指定成员之后。例如"ar -ra a.c liba.a b.c"表示将b.c加入liba.a并放在已有成员a.c之后;
  • "b":表示before,即将新成员加在指定成员之前。例如"ar -rb a.c liba.a b.c";
  • "i":表示insert,跟"b"作用相同。

3、列出库中已有成员

"ar -t liba.a" ;加"v"选项则会并列出成员的日期等属性。

4、删除库中成员

"ar -d liba.a a.c" ;表示从库中删除a.c成员。如果库中没有这个成员ar也不会给出提示。如果需要列出被删除的成员或者成员不存在的信息,就加上"v"修饰符。

5、调整库中成员

"ar -x liba.a b.c" ;

6、调整库中成员的顺序

使用"m"选项,该选项与"r"选项一样,也有3个修饰符"a","b", "i";如果要将 b.c 移动到a.c之前,则:"ar -mb a.c liba.a b.c" ;

有关Linux ar命令(更改静态库相关属性信息)的更多相关文章

  1. ruby-on-rails - Ruby on Rails 迁移,将表更改为 MyISAM - 2

    如何正确创建Rails迁移,以便将表更改为MySQL中的MyISAM?目前是InnoDB。运行原始执行语句会更改表,但它不会更新db/schema.rb,因此当在测试环境中重新创建表时,它会返回到InnoDB并且我的全文搜索失败。我如何着手更改/添加迁移,以便将现有表修改为MyISAM并更新schema.rb,以便我的数据库和相应的测试数据库得到相应更新? 最佳答案 我没有找到执行此操作的好方法。您可以像有人建议的那样更改您的schema.rb,然后运行:rakedb:schema:load,但是,这将覆盖您的数据。我的做法是(假设

  2. ruby-on-rails - Rails 常用字符串(用于通知和错误信息等) - 2

    大约一年前,我决定确保每个包含非唯一文本的Flash通知都将从模块中的方法中获取文本。我这样做的最初原因是为了避免一遍又一遍地输入相同的字符串。如果我想更改措辞,我可以在一个地方轻松完成,而且一遍又一遍地重复同一件事而出现拼写错误的可能性也会降低。我最终得到的是这样的:moduleMessagesdefformat_error_messages(errors)errors.map{|attribute,message|"Error:#{attribute.to_s.titleize}#{message}."}enddeferror_message_could_not_find(obje

  3. ruby - 解析 RDFa、微数据等的最佳方式是什么,使用统一的模式/词汇(例如 schema.org)存储和显示信息 - 2

    我主要使用Ruby来执行此操作,但到目前为止我的攻击计划如下:使用gemsrdf、rdf-rdfa和rdf-microdata或mida来解析给定任何URI的数据。我认为最好映射到像schema.org这样的统一模式,例如使用这个yaml文件,它试图描述数据词汇表和opengraph到schema.org之间的转换:#SchemaXtoschema.orgconversion#data-vocabularyDV:name:namestreet-address:streetAddressregion:addressRegionlocality:addressLocalityphoto:i

  4. ruby - 在 Ruby 中编写命令行实用程序 - 2

    我想用ruby​​编写一个小的命令行实用程序并将其作为gem分发。我知道安装后,Guard、Sass和Thor等某些gem可以从命令行自行运行。为了让gem像二进制文件一样可用,我需要在我的gemspec中指定什么。 最佳答案 Gem::Specification.newdo|s|...s.executable='name_of_executable'...endhttp://docs.rubygems.org/read/chapter/20 关于ruby-在Ruby中编写命令行实用程序

  5. ruby-on-rails - 如果为空或不验证数值,则使属性默认为 0 - 2

    我希望我的UserPrice模型的属性在它们为空或不验证数值时默认为0。这些属性是tax_rate、shipping_cost和price。classCreateUserPrices8,:scale=>2t.decimal:tax_rate,:precision=>8,:scale=>2t.decimal:shipping_cost,:precision=>8,:scale=>2endendend起初,我将所有3列的:default=>0放在表格中,但我不想要这样,因为它已经填充了字段,我想使用占位符。这是我的UserPrice模型:classUserPrice回答before_val

  6. ruby-on-rails - 在混合/模块中覆盖模型的属性访问器 - 2

    我有一个包含模块的模型。我想在模块中覆盖模型的访问器方法。例如:classBlah这显然行不通。有什么想法可以实现吗? 最佳答案 您的代码看起来是正确的。我们正在毫无困难地使用这个确切的模式。如果我没记错的话,Rails使用#method_missing作为属性setter,因此您的模块将优先,阻止ActiveRecord的setter。如果您正在使用ActiveSupport::Concern(参见thisblogpost),那么您的实例方法需要进入一个特殊的模块:classBlah

  7. ruby - 多个属性的 update_column 方法 - 2

    我有一个具有一些属性的模型:attr1、attr2和attr3。我需要在不执行回调和验证的情况下更新此属性。我找到了update_column方法,但我想同时更新三个属性。我需要这样的东西:update_columns({attr1:val1,attr2:val2,attr3:val3})代替update_column(attr1,val1)update_column(attr2,val2)update_column(attr3,val3) 最佳答案 您可以使用update_columns(attr1:val1,attr2:val2

  8. ruby-on-rails - 项目升级后 Pow 不会更改 ruby​​ 版本 - 2

    我在我的Rails项目中使用Pow和powifygem。现在我尝试升级我的ruby​​版本(从1.9.3到2.0.0,我使用RVM)当我切换ruby​​版本、安装所有gem依赖项时,我通过运行railss并访问localhost:3000确保该应用程序正常运行以前,我通过使用pow访问http://my_app.dev来浏览我的应用程序。升级后,由于错误Bundler::RubyVersionMismatch:YourRubyversionis1.9.3,butyourGemfilespecified2.0.0,此url不起作用我尝试过的:重新创建pow应用程序重启pow服务器更新战俘

  9. ruby - Capistrano 3 在任务中更改 ssh_options - 2

    我尝试使用不同的ssh_options在同一阶段运行capistranov.3任务。我的production.rb说:set:stage,:productionset:user,'deploy'set:ssh_options,{user:'deploy'}通过此配置,capistrano与用户deploy连接,这对于其余的任务是正确的。但是我需要将它连接到服务器中配置良好的an_other_user以完成一项特定任务。然后我的食谱说:...taskswithoriginaluser...task:my_task_with_an_other_userdoset:user,'an_othe

  10. ruby - Nokogiri 剥离所有属性 - 2

    我有这个html标记:我想得到这个:我如何使用Nokogiri做到这一点? 最佳答案 require'nokogiri'doc=Nokogiri::HTML('')您可以通过xpath删除所有属性:doc.xpath('//@*').remove或者,如果您需要做一些更复杂的事情,有时使用以下方法遍历所有元素会更容易:doc.traversedo|node|node.keys.eachdo|attribute|node.deleteattributeendend 关于ruby-Nokog

随机推荐