目标文件(.a或.obj)之间的链接算静态链接吗?

六道佩恩 2021-03-25 06:00:34
百度百科的说法是:静态链接是由链接器在链接时将库的内容加入到可执行程序中的做法

几乎所有搜到的说法都是说静态链接是指链接静态库,那么目标文件之间的链接算静态链接吗?
...全文
2140 32 打赏 收藏 转发到动态 举报
写回复
用AI写文章
32 条回复
切换为时间正序
请发表友善的回复…
发表回复
雷509 2021-07-17
  • 打赏
  • 举报
回复

请问楼主这个问题解决啦吗,大家的回复对你有帮助吗?

yayamami2008 2021-03-27
  • 打赏
  • 举报
回复
bucuo 不错
ㄣ葉隨々風落 2021-03-27
  • 打赏
  • 举报
回复
luj_1768 2021-03-27
  • 打赏
  • 举报
回复
准确的说,静态链接这个概念发生在可执行链接之前。静态链接是库链接,是编译时的操作。可执行链接是把目标文件接入系统执行方案的操作。
forever74 2021-03-26
  • 打赏
  • 举报
回复
自己动手搜索了一下,没有找到static link,static-link的字典式解释。(当然,这不等于它不存在。) 所以一边喝茶,一边捋一捋我主观理解的“静态链接”的由来。 起初,没有操作系统,没有高级语言,没有文件系统,自然是在物理地址上编程,没有链接。 那么链接/link应该出现在有了文件系统/操作系统/汇编语言的时代,用来在分模块的程序设计中主要表达两个意思:模块间符号解析和调用地址绑定(重定位)。 这个词出现初期,还没有库,只有分别编译/汇编的模块。后来出现了库,链接扩展了它的含义也处理库里的模块。 随着操作系统的进化,忽然有一天(浪漫说法)出现了动态链接,也就是运行时模块间符号解析与模块调用的地址绑定,链接再次扩展其含义以接受动态。 从这时起,为了与新技术进行区别,传统生成可执行文件前的链接方式就都被称为静态链接。 这就是我为什么那样认为,因为这个词本来就是作为新定义的动态链接概念的补集而出现的,而不是独立定义的,所以没有留下缝隙(既不动态也不静态的链接行为)。 我一直强调主观性,心虚。 各位老师如果也是归纳式理解,我们就各说各的好了;如果有权威解释,欢迎指出我的错误,我改。
qq_26055307 2021-03-26
  • 打赏
  • 举报
回复
那应该称呼为什么?
forever74 2021-03-26
  • 打赏
  • 举报
回复
补丁:#6的“两行以上”是“这句话上方两行距离提到的”的意思,敲的时候欠考虑了,易生歧义。
forever74 2021-03-26
  • 打赏
  • 举报
回复
我一直觉得, 静态链接库 是 供静态链接过程使用的库 的意思, 并没有“甩开我就都不算静态链接”的语义 。
forever74 2021-03-26
  • 打赏
  • 举报
回复
看来这个问题变成语文问题了 可以先约定一下确切的词汇语义和讨论范畴。 个人仍然认为,我们在讨论C语言, 立足于主函数和主函数所在的文件, 那么其他处于另外文件的函数, 只要是在运行以前,确切地说是生成可执行文件以前, 招招手呼叫一下,就从其他目标文件飘过来一个函数的二进制代码, 拼装到我的产品内, 这个过程就都算静态链接。 链接,说的就是两行以上的拼装过程,当然还有各种细节, 静态,强调的是运行前,代码进入可执行文件, 和代码的来源并没有什么必然联系。 欢迎咬文嚼字批判我。
NorZ 2021-03-26
  • 打赏
  • 举报
回复
静态链接是专指库文件的链接方式,所以不能说 .o 也是静态链接。 .o 通过 ar 打包成了 .a,链接的时候 .a 也会解包成 .o,再使用链接 .o 的方式链接
赵4老师 2021-03-26
  • 打赏
  • 举报
回复
不算
forever74 2021-03-26
  • 打赏
  • 举报
回复
没办法,自学的局限性,归纳式理解术语确实理解不精确。 一直主观认为链接是个动词,静态和动态是它的修饰,但不妨碍作为词组的静态链接和动态链接都是作为动词描述一个过程的。 静态链接描述的是生成过程中,复制目标代码进入可执行文件并进一步处理重定位等细节的过程,终止于出错或可执行文件生成。 而与之相对的动态链接用于描述可执行文件载入内存准备运行的时候和内存中的不属于这个可执行文件的二进制代码对接协调的过程。(这里的术语又不专业了) 所以请教一下静态链接这个词的比较精确的字典式定义出自哪里?求指点。
赵4老师 2021-03-26
  • 打赏
  • 举报
回复
.o组合为.a/.lib或.so/.dll或.out/.exe发生在生成时,此时应该没有静态/动态link一说。 非要说对某个函数的调用是静态链接还是动态链接,得看下面运行时对函数实际调用得情况: 当.out/.exe被运行后,调用的函数只要来自.out/.exe文件内,该函数就是静态链接;反之,不是来自.out/.exe文件内,而是来自外部.so./.dll就是动态链接。 个人理解,不喜勿喷。
NorZ 2021-03-26
  • 打赏
  • 举报
回复
引用 22 楼 forever74 的回复:
那么NorZ老师认为,静态链接和动态链接这两个术语只用于描述对库的引用,我们这里讨论的项目里两个源文件之间的普通链接过程和这两个术语无关。 我们的分歧确实是语文问题,不在于实质。 那么赵4老师,您给出的参考资料的52页上这段话描述的是两个源文件的链接过程,这段的末尾指出作者认为这个属于静态链接啊,您为什么据此认为不算呢?
你要是把随意使用专业术语,当作是语文问题...那也是你的语文理解不到位 包括你引用的这本书的内容。注意看最后一句话,前面的句号,最后一句只是表述前面的描述是“静态链接的最基本的过程”,并没有说前面的描述就是静态链接。
六道佩恩 2021-03-26
  • 打赏
  • 举报
回复
引用 21 楼 flying_music 的回复:
[quote=引用 3 楼 六道佩恩 的回复:][quote=引用 1 楼 flying_music 的回复:]目标文件之间只能算是打包吧,只是物理的组合,并没有重定位等一系列操作,所以一般不叫"链接"
你说的是目标文件组合成静态库吗?(可能是我没懂起你说的) 目标文件之间的函数调用、全局变量访问这些不是会有重定位吗?[/quote] 重定位只会发生在生成可执行文件时,多个库组成一个库就只是打包,“打包”“链接”“静态链接”“动态链接”这些都是比较专业的词,最好不要乱用,虽然基本也能明白[/quote] 我说的不一直都是目标文件链接成exe吗?
forever74 2021-03-26
  • 打赏
  • 举报
回复
那么NorZ老师认为,静态链接和动态链接这两个术语只用于描述对库的引用,我们这里讨论的项目里两个源文件之间的普通链接过程和这两个术语无关。 我们的分歧确实是语文问题,不在于实质。 那么赵4老师,您给出的参考资料的52页上这段话描述的是两个源文件的链接过程,这段的末尾指出作者认为这个属于静态链接啊,您为什么据此认为不算呢?
flying_music 2021-03-26
  • 打赏
  • 举报
回复
引用 3 楼 六道佩恩 的回复:
[quote=引用 1 楼 flying_music 的回复:]目标文件之间只能算是打包吧,只是物理的组合,并没有重定位等一系列操作,所以一般不叫"链接"
你说的是目标文件组合成静态库吗?(可能是我没懂起你说的) 目标文件之间的函数调用、全局变量访问这些不是会有重定位吗?[/quote] 重定位只会发生在生成可执行文件时,多个库组成一个库就只是打包,“打包”“链接”“静态链接”“动态链接”这些都是比较专业的词,最好不要乱用,虽然基本也能明白
  • 打赏
  • 举报
回复
库(.lib、a等等)是目标文件(.obj、.o之类)的合集,链接是以目标文件为单位的,链接单独的目标文件也是可以的
NorZ 2021-03-26
  • 打赏
  • 举报
回复
引用 18 楼 forever74 的回复:
所以精确一些描述, 在链接/连接这个范畴/全集下, 1、静态链接无疑是个子集,动态链接也是,那么静态链接子集和动态链接子集的并集(我们这里不讨论交集)有没有非空补集?有的话叫做什么? 2、main.o和fun.o的链接,main.obj和fun.obj的链接,在这个语境里完全是同义,它在静态链接子集里,还是在补集里? 我完全没有引经据典,全凭不知来源的记忆和主观理解,认为, 1、不存在这个补集 2、所以它只能落进静态链接圈
静态链接和动态链接,只是链接库文件的方式。 从来没有.o 文件的动态和静态链接之说。 .o 文件的链接过程就大概就叫做链接 linking 吧,和库文件的链接过程是不同
forever74 2021-03-26
  • 打赏
  • 举报
回复
所以精确一些描述, 在链接/连接这个范畴/全集下, 1、静态链接无疑是个子集,动态链接也是,那么静态链接子集和动态链接子集的并集(我们这里不讨论交集)有没有非空补集?有的话叫做什么? 2、main.o和fun.o的链接,main.obj和fun.obj的链接,在这个语境里完全是同义,它在静态链接子集里,还是在补集里? 我完全没有引经据典,全凭不知来源的记忆和主观理解,认为, 1、不存在这个补集 2、所以它只能落进静态链接圈
加载更多回复(12)
​ 博主介绍:✌在职Java研发工程师、专注于程序设计、源码分享、技术交流、专注于Java技术领域和毕业设计✌项目名称基于Web的酒店客房管理系统的设计与实现系统说明3.2.1  用户模块功能分析前台模块应主要包括用户登录模块、用户注册模块、查看客房信息模块、客房预定 模块、用户留言模块、充值模块和个人信息维护模块。用户登录模块:用户通过输入注册的的账号和密码,然后进行身份验证,匹配成功 后实现登录功能。用户注册模块:用户输入合法的账号和密码可以实现注册功能。 查看客房信息模块:用户可以通过首页查看客房的价格,图片,详情等信息,从而   可以选择想要预定的房间。 客房预定模块:用户选择自己想要预定的客房后,可以通过输入相关信息进行订房操作。用户留言模块:用户可以向管理员发送留言。 充值模块:用户可以通过添加银行卡再为自己进行充值操作。 个人信息维护模块:用户可以修改自己的姓名、密码、身份证号等信息,还可以查看自己的订单。3.2.2  管理员模块功能分析对于管理员而言,一个好的管理系统总是能让酒店的管理工作事半功倍[7]。管理员 能够通过这个系统对自己的酒店情况一目了然,应该包括客户留言模块、客房管理模 块、订房信息管理模块、入住信息管理模块、统计分析模块、酒店新闻管理模块、会 员信息管理模块、员工信息管理模块、系统用户管理模块、个人信息维护模块。客户留言模块:管理员可以查看并回复用户的留言。客房管理模块:管理员可以管理客房信息,可以添加新的客房,删除已经停用的客房信息,还可以修改现有的客房信息。订房信息管理模块:管理员可以处理用户的订房请求,为用户办理入住手续。入住信息管理模块:对于没有注册的线下客户,也可以办理入住手续。统计分析模块:可以对酒店所有的入住信息进行记录和总结分析。酒店新闻管理模块:管理员可以更新网站上的新闻公告,展示图片等信息。会员信息管理模块:管理员可以查看到所有的注册会员信息,可以对会员信息进行删除,修改,添加操作。员工信息管理模块:管理员可以查看到自己公司所有的员工信息,而且还可以对员工的相关信息进行管理。系统用户管理模块:管理员可以查看到所有的系统管理员信息并对管理员信息进行管理。个人信息维护模块:管理员可以更改自己的登录密码或者是姓名、性别、手机号等 相关个人信息。​编辑 环境需要1.运行环境:最好是java jdk 1.8,我们在这个平台上运行的。其他版本理论上也可以。2.IDE环境:IDEA,Eclipse,Myeclipse都可以。推荐IDEA;3.tomcat环境:Tomcat 7.x,8.x,9.x版本均可4.硬件环境:windows 7/8/10 1G内存以上;或者 Mac OS; 5.数据库:MySql 5.7版本;6.是否Maven项目:否;技术栈1. 后端:Spring+SpringMVC+Mybatis2. 前端:JSP+CSS+JavaScript+jQuery使用说明1. 使用Navicat或者其它工具,在mysql中创建对应名称的数据库,并导入项目的sql文件;2. 使用IDEA/Eclipse/MyEclipse导入项目,Eclipse/MyEclipse导入时,若为maven项目请选择maven;若为maven项目,导入成功后请执行maven clean;maven install命令,然后运行;3. 将项目中springmvc-servlet.xml配置文件中的数据库配置改为自己的配置;4. 运行项目,在浏览器中输入http://localhost:8080/ 登录运行截图​编辑​编辑​编辑​编辑​编辑​编辑​编辑​编辑​编辑​编辑​编辑​编辑​编辑​编辑​编辑 用户管理控制层:package com.houserss.controller;import javax.servlet.http.HttpSession;import org.apache.commons.lang3.StringUtils;import org.springframework.beans.factory.annotation.Autowired;import org.springframework.stereotype.Controller;import org.springframework.web.bind.annotation.RequestMapping;import org.springframework.web.bind.annotation.RequestMethod;import org.springframework.web.bind.annotation.RequestParam;import org.springframework.web.bind.annotation.ResponseBody;import com.houserss.common.Const;import com.houserss.common.Const.Role;import com.houserss.common.ServerResponse;import com.houserss.pojo.User;import com.houserss.service.IUserService;import com.houserss.service.impl.UserServiceImpl;import com.houserss.util.MD5Util;import com.houserss.util.TimeUtils;import com.houserss.vo.DeleteHouseVo;import com.houserss.vo.PageInfoVo;/** * Created by admin */@Controller@RequestMapping(/user/)public class UserController if (ip != null && ip.length() > 0) String[] ips = ip.split(,);for (int i = 0; i  

69,377

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧