天道酬勤,学无止境

链接到某物是什么意思?(What does it mean to link against something?)

问题

我经常听到“链接到图书馆”这个词。 我是编译器和链接的新手,所以我想更多地了解这一点。

链接库是什么意思,什么时候不这样做会导致问题?

回答1

库是包含已编译代码的“档案”。 通常,您希望使用现成的库来使用一些您不想自己实现的功能(例如,解码 JPEG、解析 XML、为您提供 GUI 小部件,等等)。

通常在 C 和 C++ 中使用库是这样的:你#include包含函数/类声明的库的一些头文件 - 即它们告诉编译器你需要的符号确实存在于某处,而不实际提供它们的代码。 每当您使用它们时,编译器都会在目标文件中放置一个占位符,它表示该函数调用将在链接时解析,当其余的目标模块可用时。

然后,在链接时,您必须指定要找到库函数的编译代码的实际库; 然后,链接器会将这个编译后的代码与你的代码链接起来,并生成最终的可执行文件(或者,在动态库的情况下,它会为加载器添加相关信息,以便在运行时执行动态链接)。

如果您没有指定要链接的库,则链接器将有未解析的引用 - 即它会看到某些函数已声明,您在代码中使用了它们,但无处可找到它们的实现; 这就是臭名昭著的“未定义引用错误”的原因。

请注意,所有这些过程与编译由多个.cpp文件组成的项目时通常发生的情况相同:每个.cpp都是独立编译的(仅通过原型了解其他文件中定义的函数,通常编写在.h文件中),最后所有内容都链接在一起以生成最终的可执行文件。

受限制的 HTML

  • 允许的HTML标签:<a href hreflang> <em> <strong> <cite> <blockquote cite> <code> <ul type> <ol start type> <li> <dl> <dt> <dd> <h2 id> <h3 id> <h4 id> <h5 id> <h6 id>
  • 自动断行和分段。
  • 网页和电子邮件地址自动转换为链接。

相关推荐
  • “ ODR使用”某物是什么意思?(What does it mean to “ODR-use” something?)
    问题 这只是在另一个问题的背景下提出的。 显然,仅在使用ODR时才实例化类模板中的成员函数。 有人可以解释一下这到底是什么意思。 维基百科上有关“一个定义规则”(ODR)的文章没有提到“ ODR使用”。 但是该标准将其定义为 除非其对象满足在常量表达式中出现的要求(5.19)并且立即应用左值到右值转换(4.1),否则将使用其名称显示为可能评估的表达式的变量。 在[basic.def.odr]中。 编辑:显然这是错误的部分,整个段落包含针对不同事物的多个定义。 这可能与类模板成员函数有关: 如果非重载函数的名称显示为可能评估的表达式或一组候选函数的成员,则在非重载函数(如果它是从可能评估的表达式中引用)通过重载解析选择时,将被奇数使用。函数及其名称未明确限定。 但是我不明白,该规则如何在多个编译单元中起作用? 如果显式实例化类模板,是否会实例化所有成员函数? 回答1 它只是一个任意定义,标准使用它来指定何时必须为实体提供定义(而不只是声明)。 该标准不只是说“已使用”,因为它可以根据上下文进行不同的解释。 而且,某些ODR的使用并不真正与通常与“使用”相关联的使用相对应。 例如,虚拟函数始终是ODR使用的,除非它是纯函数,即使它实际上并未在程序中的任何位置被调用。 完整的定义在§3.2第二段中,尽管其中包含对其他部分的引用以完成定义。 关于模板,使用ODR只是问题的一部分;
  • 此javascript语法是什么意思? (0,_parseKey2.default)(某物)[重复](What does this javascript syntax mean ? (0, _parseKey2.default)(something) [duplicate])
    问题 这个问题已经在这里有了答案: 为什么babel重写导入的函数调用(0,fn)(…)? (3个答案) 4年前关闭。 我在Webpack生成的库中到处都可以找到这种表示法,但是我不明白: var a = (0, _parseKey2.default)(something) (0, _parseKey2.default)代表什么? 我不记得在函数参数中其他地方的括号之间用逗号分隔表达式,所以也许我只是缺少一些简单的东西。 谢谢你的帮助。 回答1 这是给_parseKey2.default正确的this (或者说,没有this的话),也就是调用它作为一个普通的功能,而不是一个方法。 考虑: var p = { f : function() { console.log(this) }, x : "foo" }; p.f(); // { f: ... x: foo } (p.f)(); // { f: ... x: foo } (0, p.f)(); // implicit global this 逗号表达式是一种更简洁的方法: var unbound = p.f; unbound();
  • ::在angularJS中是什么意思(What does :: mean in angularJS)
    问题 我看过这样的语法 <a href={{ ::something}}>some other thing</a> 那双冒号是做什么用的? 如果将其删除会怎样? 回答1 ::用于一次性绑定。 表达式稳定后(即在第一个摘要之后),表达式将停止重新计算。 因此,对something所做的任何更新将不可见。 回答2 它用于绑定控制器中的模型以仅查看。 如果从视图中进行更改,它将不会更新您的控制器型号。 这意味着它用于实现一次绑定。 例子 angular.module("myApp", []).controller('ctrl', ['$scope', function($scope) { $scope.label = 'Some text'; }]); <script src="https://ajax.googleapis.com/ajax/libs/angularjs/1.3.2/angular.min.js"></script> <html ng-app="myApp"> <body ng-controller="ctrl"> <div>{{::label}}</div> // this will print `Some text` on load <div>{{label}}</div> // this will too print `Some text` on load <br
  • 在Java中@符号是什么意思?(in java what does the @ symbol mean?)
    问题 我知道出于文档目的的注释中的含义,但除此之外又意味着什么? (我通常只会在Google上搜索,但结果中会显示每个非字母符号) 回答1 @符号表示Java注释。 Java注释的作用是,它为变量,方法,类,接口或其他语言元素添加了特殊的属性。 (可以在声明注释时进行配置。)将注释添加到某物时,程序的其他部分可以检查某物是否具有注释。 然后,它可以使用此信息来做他们需要的任何事情。 让我给你举一些例子: @Override注解 public class SuperClass { public void someInterestingMethod() { System.out.println("Superclass!"); } } public class DerivedClass extends SuperClass { public void someInterestngMethod() { System.out.println("Derived class!"); } } 当您执行此操作时: SuperClass sc = new DerivedClass(); sc.someInterestingMethod(); 应该动态调度someInterestingMethod()调用,并打印"Derived class!" , 正确的? 好吧,派生类的方法实际上是拼写错误的
  • C中的双下划线(__const)是什么意思?(What does double underscore ( __const) mean in C?)
    问题 extern int ether_hostton (__const char *__hostname, struct ether_addr *__addr) __THROW; 我在Linux机器上的/usr/include/netinet/ether.h中找到了上面的函数定义。 有人可以解释const(关键字),addr(标识符)和最后__THROW前面的双下划线的含义。 回答1 在C语言中,为实现保留了以下划线开头,大写字母或其他下划线开头的符号。 您作为C的用户,不应创建任何以保留序列开头的符号。 在C ++中,该限制更为严格。 您用户可能不会创建包含双下划线的符号。 鉴于: extern int ether_hostton (__const char *__hostname, struct ether_addr *__addr) __THROW; __const表示法允许(可能不太可能)使用此代码的编译器支持原型表示法,但对C89标准关键字const理解不正确。 autoconf宏仍然可以检查编译器是否对const具有有效的支持; 此代码可以与不支持该功能的损坏编译器一起使用。 __hostname和__addr的使用是对您(标头用户)的一种保护措施。 如果使用GCC和-Wshadow选项进行编译,则当任何局部变量-Wshadow全局变量时,编译器将发出警告。
  • “弱链接”框架是什么意思?(What does it mean to “weak-link” a framework?)
    问题 在Xcode中,我可以将框架设置为“可选”,而不是“必需”,这意味着该框架是弱链接。 这是否意味着该框架仅在导入到某处时才包含在捆绑软件中? 我想弱链接一些使用私有API的调试框架,并且我不希望它们出现在App Store构建中。 回答1 重要说明:此答案是在宣布iOS 8之前编写的。 尽管技术细节仍然适用于系统框架,但是现在可以构建您自己的,动态链接的框架,这些框架随您的应用程序捆绑在一起。 存在一些限制,例如,只有一个应用程序及其扩展程序才能链接到嵌入式框架的同一实例,但事实是自iOS 8起,就可以使用自定义的动态链接框架了。如果您想了解更多信息,请参阅本指南。 (使用嵌入式框架共享代码)和WWDC 2014会议416,构建现代框架。 原始答案:没有一个(平台)框架真正“包含在捆绑包中”。 相反,将应用程序添加到“将二进制文件与库链接”构建阶段后,您的应用程序便具有对框架的引用(“链接”)。 这些框架已预先安装在设备上。 运行应用程序时,动态链接程序(在设备上)会解析应用程序的所有框架引用,这意味着将加载框架代码,以便您的应用程序可以使用它。 某些框架可能并非在您打算支持的所有设备上都可用,例如,iOS 6中引入了PassKit。如果您运行的应用程序在iOS 5设备上与PassKit链接,则该应用程序在启动后会崩溃,因为动态链接器无法启动在设备上找到框架。 但是
  • Shell命令末尾的“ / dev / null”是什么意思(What does “/dev/null” mean at the end of shell commands)
    问题 以下命令之间有什么区别? ssh myhostname "command1; command2;...commandn;" 2>/dev/null ssh myhostname "command1; command2;...commandn;" 2>是什么意思? /dev/null是什么意思? 我在某处读取到命令结果将被写入文件/dev/null而不是控制台! 这样对吗? 对我来说,文件名为null似乎很奇怪! 回答1 2>表示将“重定向标准错误”重定向到给定文件。 /dev/null是空文件。 写入其中的所有内容都将被丢弃。 它们在一起意味着“丢弃任何错误消息”。 回答2 1是标准输出。 2是stderr。 然后有时您会发现2>&1 ,这意味着将stderr重定向到stdout。 回答3 '/ dev / null'本质上是指“陷入虚无”,已被丢弃。 您提到的2指的是错误输出,应该将其定向到该位置。 回答4 2>表示将标准错误发送给某物 / dev / null表示bin 回答5 1)将标准错误中的所有内容通过管道传递到/ dev / null(因此将其忽略并且不显示它) 2)Dev null只是指向无处,将任何内容通过管道传递给它,然后它消失了。
  • = + _在JavaScript中是什么意思(What does = +_ mean in JavaScript)
    问题 我想知道= + _运算符在JavaScript中的含义。 看起来像是在做作业。 例子: hexbin.radius = function(_) { if (!arguments.length) return r; r = +_; dx = r * 2 * Math.sin(Math.PI / 3); dy = r * 1.5; return hexbin; }; 回答1 r = +_; +尝试将_转换为数字。 _只有一个变量名称(而不是操作者),它可能是a , foo等 例子: +"1" 将“ 1”强制转换为纯数字1。 var _ = "1"; var r = +_; r现在是1 ,而不是"1" 。 此外,根据算术运算符的MDN页面: 一元加号运算符位于其操作数之前,并求值为其操作数,但尝试将其转换为数字(如果尚未转换为数字) 。 [...]它可以转换整数和浮点数的字符串表示形式,以及非字符串值true , false和null 。 支持十进制和十六进制(带"0x"前缀)格式的整数。 支持负数(尽管不支持十六进制)。 如果它不能解析特定值,则它将评估为NaN 。 还应注意的是 一元加号是将某物转换为数字的最快且首选的方式 回答2 它不是赋值运算符。 _只是传递给函数的参数。 hexbin.radius = function(_) { // ^ It is passed
  • “ dyn”在类型中是什么意思?(What does “dyn” mean in a type?)
    问题 我最近看过使用dyn关键字的代码: fn foo(arg: &dyn Display) {} fn bar() -> Box<dyn Display> {} 这个语法是什么意思? 回答1 TL; DR:这是用于指定特征对象类型的语法,出于清晰起见,必须指定该语法。 从Rust 1.0开始,特质带来双重生活。 声明了特征后,就可以将其用作特征或类型: // As a trait impl MyTrait for SomeType {} // As a type! impl MyTrait {} impl AnotherTrait for MyTrait {} 可以想象,这种双重含义可能会引起一些混乱。 此外,由于MyTrait类型是未调整大小/动态大小的类型,因此这会使人们暴露于非常复杂的错误消息中。 为了改善此问题,RFC 2113引入了dyn语法。 从Rust 1.27开始可以使用以下语法: use std::{fmt::Display, sync::Arc}; fn main() { let display_ref: &dyn Display = &42; let display_box: Box<dyn Display> = Box::new(42); let display_arc: Arc<dyn Display> = Arc::new(42); }
  • 与 Homebrew 链接/取消链接是什么意思?(What does linking/unlinking with Homebrew mean?)
    问题 用 Homebrew 链接/取消链接是什么意思? 回答1 它将已安装的包(位于/usr/local/Cellar )符号链接到/usr/local 。 所以当你输入例如: $ <name-of-binary> 在您的终端(例如$ rvm )中,然后运行通过 brew 安装的软件包。 回答2 它从安装在 Cellar 中的软件包创建一个符号链接(使用自制软件安装的常规软件包已经链接)。 这也允许来自 Cellar 的符号链接安装作为其他自制安装的依赖项(如果需要)。 这在另一篇文章中有解释。 此外,对于所有自制命令,您可以使用 --help 选项(例如brew link --help )获得公式的描述。
  • Boost的“仅标头库”和“自动链接”是什么意思?(What does Boost mean by “header-only libraries” and “automatic linking”?)
    问题 在Boost库文档页面上,有两个类别,分别为“仅标头库”和“自动链接”。 我认为“仅标头库”意味着您不必链接到Boost库就可以使用它们,而“自动链接”意味着您必须链接。 但是,当我使用Boost.Timer ,我必须链接一个名为timer的静态或动态库( libboost_timer.a和libboost_timer.so.1.48.0以及在Linux库路径下的各种软链接),这显然是确切的库文件Boost.Timer 。 我什至需要针对Boost.System和Boost.Chrono进行链接,尽管可以理解的是,库本身使用了一些其他需要链接的库。 另一方面,Boost明确指出Boost.Asio属于“自动链接” ,但没有任何库文件命名为asio 。 那么,成为“仅标头的库”或“自动链接”到底意味着什么? 还是纯粹是一个错误? 回答1 如您所说,“仅标头库”意味着整个库都在标头文件中,因此一个(或几个) #include行就足以使用它。 无需链接。 “自动链接”表示,尽管该库需要进行一些链接(直接或作为依赖项),但您无需在编译器行中指定它,因为#include文件将带来一些魔术效果如果编译器支持,则自动自动创建适当的库。 例如,在MSVC编译器中,它们使用#pragman comment(lib, "...") ; 在Borland编译器中,他们使用#pragma
  • 这是什么意思:data-component-bound =“ true”?(What does this mean: data-component-bound=“true”?)
    问题 data-component-bound =“ true”是什么意思? 我已经在一个折叠的元素中找到了它,但是调整该值不会执行任何操作。 我尝试过在Stack Overflow和Google上寻找属性“ data-component-bound”,但它指向的是各种jquery文章的有限集合,这些文章对我来说都是理所当然的,并且理所当然。 [编辑发布一些答案] 嗯,我现在看到我应该一直在寻找“数据”来解决这个问题。 通过这样做,我发现了这篇有用的文章可以对下一个人有所帮助:http://www.sitepoint.com/use-html5-data-attributes/ 回答1 data-属性是可扩展的:代码的编写者可以组成他们喜欢的任何数据属性。 在这种情况下,从快速浏览的角度来看,它似乎是用于网站的内部工作的,以了解何时“组件”(即DOM元素)“绑定”到某物(事件,交互作用等)。 通常, data-属性用于此目的:数据。 它们存储任何数据,因此通常用于替代非标准属性,否则这些属性将在验证器中进行标记。 回答2 HTML数据属性允许您设置元素的自定义数据。 data-component-bound的含义由您的代码或可能使用的某些CSS或javascript框架确定。 在代码库中搜索“组件绑定”,以查看是否正在使用它。 如果找不到任何内容,请在Google上进行搜索
  • 这个GCC错误“ ...重新定位以适合……”是什么意思?(What does this GCC error “… relocation truncated to fit…” mean?)
    问题 我正在对主机加速器系统的主机端进行编程。 主机在Ubuntu Linux下的PC上运行,并通过USB连接与嵌入式硬件通信。 通过在嵌入式硬件的内存之间复制内存块来执行通信。 板上的内存上有一个内存区域,我可以将其用作邮箱,在其中写入和读取数据。 邮箱被定义为结构,我使用相同的定义在主机空间中分配镜像邮箱。 过去,我成功地使用了此技术,因此现在将宿主Eclipse项目复制到当前项目的工作区中,并进行了适当的名称更改。 奇怪的是,在构建宿主项目时,我现在收到以下消息: 建立目标:fft2d_host 调用:GCC C链接器 gcc -L / opt / adapteva / esdk / tools / host / x86_64 / lib -o“ fft2d_host” ./src/fft2d_host.o -le_host -lrt ./src/fft2d_host.o:在函数“ main”中: fft2d_host.c :(。text + 0x280):截断以适合:R.X_86_64_PC32针对./src/fft2d_host.o的COMMON部分中定义的符号'Mailbox' 此错误是什么意思,为什么它不能在当前项目上构建,而对于较旧的项目却可以? 回答1 您正在尝试以一种这样的方式链接您的项目
  • “ javascript:void(0)”是什么意思?(What does “javascript:void(0)” mean?)
    问题 <a href="javascript:void(0)" id="loginlink">login</a> 我已经看过很多次href ,但是我不知道这到底意味着什么。 回答1 void运算符计算给定的表达式,然后返回undefined 。 void运算符通常仅用于获取undefined原始值,通常使用“ void(0) ”(等效于“ void 0 ”)。 在这些情况下,可以使用全局变量undefined代替(假设尚未将其分配给非默认值)。 这里提供了一个解释:void运算符。 您之所以要使用链接的href这样做是因为,通常,一个javascript: URL会将浏览器重定向到评估该JavaScript结果的纯文本版本。 但是,如果结果是undefined ,那么浏览器将停留在同一页面上。 void(0)只是一个简短的脚本,其结果为undefined 。 回答2 除了技术性答案外, javascript:void表示作者做错了。 没有充分的理由使用javascript: pseudo-URL(*)。 在实践中,如果任何人尝试“书签链接”,“在新标签页中打开链接”等操作,都会引起混乱或错误。 现在,这种情况已经发生了很多,人们已经习惯了在新标签上单击中间键:它看起来像一个链接,您想在新标签中阅读它,但事实证明它根本不是真正的链接,并在单击鼠标中键时显示空白页或JS错误等不良结果。
  • VC ++“生成代码”是什么意思?(VC++ 'Generating Code', what does it mean?)
    问题 在Visual Studio中进行编译时,编译器将根据自己的判断输出以下内容: 1>正在生成代码... 它到底在做什么? 回答1 它正在按照它说的去做:它正在生成机器代码。 许多编译器将C / C ++源代码转换成某种中间的内部表示形式,随后将其用作生成实际机器代码的源代码。 Visual C ++编译器(与许多其他编译器一样)分批执行此操作:首先,它将一堆源文件转换为该中间表示形式,然后将它们全部转换为机器代码(然后在下一批中开始工作)。 这是当您看到“正在生成代码”消息时发生的情况。 我不知道将源文件分成批处理到底使用了什么逻辑。 也许它只是按大小来工作:到目前为止生成的所有中间表示的总大小达到某个限制后,它将切换到“生成代码”模式。 也许那里还有其他逻辑在起作用。 无论如何,在这种情况下,不合格的术语“代码”不指代源代码,这意味着它与模板和/或预处理器或类似内容无关。 而且,用不合格的“代码”(而不是合格的“源代码”)引用C源代码是一件非常小众的事情,与实际的程序员相比,市场部门的工作更多。 在程序员的水平上,没有人将C源代码称为“代码” :) 回答2 一次给编译器提供多个输入文件,然后编译器一次读取(解析)多个输入文件,然后才为它们生成输出(目标文件),然后再读取更多输入文件。 我猜想这是一种优化,大概是因为对磁盘的混合读/写访问比(首先)读访问和(然后
  • “语义上正确”是什么意思?(What does “semantically correct” mean?)
    问题 我已经在CSS对话中看到了很多。 语义正确是什么意思? 回答1 正确贴标签 这意味着您正在调用的东西实际上是什么。 典型的示例是,如果某物是一个table ,则它应包含数据的行和列。 将其用于布局在语义上是不正确的-如果不是,则是说“这是一个表”。 另一个示例:列表( <ul>或<ol> )通常应用于对相似项( <li> )进行分组。 您可以为该组使用div ,为每个项目使用<span> ,然后将每个span样式设置为在带有项目符号点的单独行中,并且它可能看起来像您想要的样子。 但是“这是一个列表”传达了更多信息。 适合HTML背后的理想 HTML代表“超文本标记语言”; 其目的是标记或标记您的内容。 标记得越准确,效果越好。 HTML5中引入了新元素,以更准确地标记常见的网页部分,例如页眉和页脚。 使它更有用 所有这些语义标记有助于机器解析您的内容,从而对用户有所帮助。 例如: 了解您的元素是什么,使浏览器可以使用合理的默认值来设置外观和行为方式。 这意味着您要做的定制工作较少,并且更有可能在不同的浏览器中获得一致的结果。 浏览器可以正确地应用CSS(级联样式表),描述每种内容的外观。 您可以提供其他样式,或者用户可以使用自己的样式。 只要您在语义上标记了元素,诸如“我希望标题很大”之类的规则就可以使用。 如果将逻辑部分分解成fieldsets
  • 泛型有什么用真的是什么意思? [复制](Generics what does <?> actually mean? [duplicate])
    问题 这个问题已经在这里有了答案: 8年前关闭。 可能重复: List <?>在Java泛型中是什么意思? Java泛型的类型参数中的问号是什么意思? 抱歉,但是很难搜索<?> 。 关于Java泛型是什么意思? 我了解<A extends B>和<A super B> ,但是我以前从未见过这个问号。 回答1 <?>是<?>的简写<? extends Object> <? extends Object> ,也称为无界通配符。 因此,您可以在泛型中指定任何类型的对象。 例如, List类声明为List<?> ,因为它可以是您想要的任何内容的列表。 资源: 有效的Java-Generics.pdf Java语言规范-类型参数和通配符 oracle.com-Java教程,通配符 回答2 它是wildcard类型。 它简短? extends Object ? extends Object 如果得到它,那么您所知道的就是它的Object 。 如果尝试设置,则不能,因为它可以是Object的任何子类。 回答3 通配符Generic是“某物”。 它将作为对象的扩展来处理。 从Java文档中: 在通用代码中,称为通配符的问号(?)表示未知类型。 通配符可以在多种情况下使用:作为参数,字段或局部变量的类型; 有时作为返回类型(尽管更具体的做法是更好的编程习惯)。 通配符从不用作泛型方法调用
  • Bash 脚本:#!/bin/bash 是什么意思? [复制](Bash Script : what does #!/bin/bash mean? [duplicate])
    问题 这个问题在这里已经有了答案: 为什么需要将 #!/bin/bash 放在脚本文件的开头? (10 个回答) 6年前关闭。 在 bash 脚本中,第一行的#!/bin/bash是什么意思? 更新: #!/bin/bash和#!/bin/sh之间有区别吗? 回答1 这称为shebang,它告诉shell 在执行时用什么程序来解释脚本。 在您的示例中,脚本将由 bash shell 解释和运行。 其他一些示例 shebang 是: (来自维基百科) #!/bin/sh — Execute the file using sh, the Bourne shell, or a compatible shell #!/bin/csh — Execute the file using csh, the C shell, or a compatible shell #!/usr/bin/perl -T — Execute using Perl with the option for taint checks #!/usr/bin/php — Execute the file using the PHP command line interpreter #!/usr/bin/python -O — Execute using Python with optimizations to code #
  • * | *在CSS中是什么意思?(What does *|* this mean in CSS?)
    问题 我刚刚看到了这个: *|*:link与Firebug的*|*:link 。 似乎是Firefox附加的一些默认样式,但是*|*是什么意思? 回答1 它的意思是“所有名称空间中的所有元素都是:link 。” 有关通用选择器和名称空间的更多信息。 回答2 *|*是一个符合名称空间的通用选择器。 第一个*表示任何名称空间(包括默认名称空间和缺少名称空间),第二个*表示任何元素类型。 如前所述,选择器*|*:link表示任何名称空间中的任何元素,而该元素是未访问的超链接( :link )。 要明确的是, *| 前缀表示任何名称空间中的某些元素,包括: 默认名称空间中的元素(例如XHTML) 其他任何命名空间中的元素(例如Firefox中的XUL) 不在命名空间中的元素 CSS有一个专门用于名称空间声明的模块。 文档类型确定应将哪种元素指定为超链接: 在HTML和XHTML中,这始终是具有href属性a元素。 在XUL中,我相信这是带有href属性的label.text-link元素。 请注意,只有在使用CSS为XML文档或其他类似定义命名空间的文档类型设置样式时,CSS命名空间才有用。 这包括带有自定义XML名称空间的XHTML页面。 在常规HTML文档中,通常无需在选择器中使用名称空间前缀。 也就是说,浏览器在其用户代理样式表中声明一个默认名称空间,该名称空间始终与XHTML
  • “静态链接”和“动态链接”是什么意思?(What do 'statically linked' and 'dynamically linked' mean?)
    问题 我经常听到术语“静态链接”和“动态链接”,通常是指用C,C ++或C#编写的代码。 他们是什么,他们到底在说什么,他们有什么联系? 回答1 从源代码(您编写的内容)到可执行代码(您运行的内容)的获取过程(在大多数情况下,对解释代码进行打折)有两个阶段。 首先是编译,它将源代码转换为目标模块。 第二个链接是将对象模块组合在一起以形成可执行文件的链接。 区别在于:允许第三方库包含在您的可执行文件中,而您看不到它们的源代码(例如,用于数据库访问,网络通信和图形用户界面的库),或者用于编译不同语言的代码( C和汇编代码),然后将它们链接在一起。 当您将文件静态链接到可执行文件时,该文件的内容将在链接时包括在内。 换句话说,文件的内容实际上已插入到将要运行的可执行文件中。 动态链接时,可执行文件中将包含指向要链接的文件的指针(例如,文件的文件名),而链接时不包含该文件的内容。 只有在以后运行该可执行文件时,这些动态链接的文件才被购买,并且它们仅被购买到该可执行文件的内存副本中,而不是磁盘上的一个副本中。 基本上,这是一种延迟链接的方法。 还有一个更延迟的方法(在某些系统上称为“后期绑定”),在您实际尝试在其中调用函数之前,它不会引入动态链接的文件。 静态链接的文件在链接时被“锁定”到可执行文件,因此它们永远不会改变。 可执行文件引用的动态链接文件可以通过替换磁盘上的文件来更改。