gcc - 如何从静态库输出 (.a) 中删除所有绝对路径

2024-06-21

我正在使用 GCC for ARM (红色套件 4 恩智浦 http://www.code-red-tech.com/red-suite-4-nxp.php)。我正在编译用于最终应用程序的静态库文件(.a)。我需要配置项目,以便任何开发人员都可以生成完全相同的静态库输出。 (这主要是为了让新开发人员可以验证他们的设置是否正确。)我有两个项目副本(两个来自 SVN 的签出)。当我使用每个文件进行构建时,我注意到静态库 .a 输出文件中存在一些绝对路径信息。这意味着 SVN 检测到更改。我已经在使用 ar -D (确定性)选项。还有其他选项可以删除路径信息吗?我尝试了 gcc -s 但这不起作用(看来这仅适用于最终可执行文件,而不适用于库)

我不知道绝对路径在 .a 中的位置/原因,但如果有人能指出正确的方向,我可以提供更多信息。

我已经查看了 strip 实用程序手册页(尚未尝试),这会删​​除此路径信息吗?

另外,我正在使用 Red Suite 来管理项目,因此我尝试以 Red Suite 的方式做事(并让它做它的事情)。但是,如果我需要调整 gcc 或 ar 选项,我确实知道该怎么做。我只是不知道要更改什么选项。

这是构建控制台的输出。这会导致我的项目的绝对路径包含在生成的 .a 中。这就是我正在努力解决的问题。

**** Build of configuration Release for project lib_touch ****

make -j all 
Building file: C:/Users/my_user_name/Documents/My Project Verification build/src/touch/Touch.c
Building file: C:/Users/my_user_name/Documents/My Project Verification build/src/touch/TouchCalibration.c
Building file: C:/Users/my_user_name/Documents/My Project Verification build/src/touch/TouchPoint.c
Building file: C:/Users/my_user_name/Documents/My Project Verification build/src/touch/TouchEventQueue.c
Invoking: MCU C Compiler
Invoking: MCU C Compiler
arm-none-eabi-gcc -D__REDLIB__ -DNDEBUG -D__CODE_RED -D__USE_CMSIS=CMSISv2p00_LPC177x_8x -I"C:\Users\my_user_name\Documents\My Project Verification build\src\build\RedSuite4NXP\CMSISv2p00_LPC177x_8x\inc" -I../../../../board -I../../../../board/lpc1788 -I../../../../communication -I../../../../events -I../../../../geometry -I../../../../graphics -I../../../../hmilogic/include -I../../../../sound -I../../../../util -O3 -Wall -Werror -c -fmessage-length=0 -fno-builtin -ffunction-sections -fdata-sections -std=gnu99 -mcpu=cortex-m3 -mthumb -MMD -MP -MF"touch/Touch.d" -MT"touch/Touch.d" -o"touch/Touch.o" "C:/Users/my_user_name/Documents/My Project Verification build/src/touch/Touch.c"
arm-none-eabi-gcc -D__REDLIB__ -DNDEBUG -D__CODE_RED -D__USE_CMSIS=CMSISv2p00_LPC177x_8x -I"C:\Users\my_user_name\Documents\My Project Verification build\src\build\RedSuite4NXP\CMSISv2p00_LPC177x_8x\inc" -I../../../../board -I../../../../board/lpc1788 -I../../../../communication -I../../../../events -I../../../../geometry -I../../../../graphics -I../../../../hmilogic/include -I../../../../sound -I../../../../util -O3 -Wall -Werror -c -fmessage-length=0 -fno-builtin -ffunction-sections -fdata-sections -std=gnu99 -mcpu=cortex-m3 -mthumb -MMD -MP -MF"touch/TouchCalibration.d" -MT"touch/TouchCalibration.d" -o"touch/TouchCalibration.o" "C:/Users/my_user_name/Documents/My Project Verification build/src/touch/TouchCalibration.c"
Invoking: MCU C Compiler
Invoking: MCU C Compiler
arm-none-eabi-gcc -D__REDLIB__ -DNDEBUG -D__CODE_RED -D__USE_CMSIS=CMSISv2p00_LPC177x_8x -I"C:\Users\my_user_name\Documents\My Project Verification build\src\build\RedSuite4NXP\CMSISv2p00_LPC177x_8x\inc" -I../../../../board -I../../../../board/lpc1788 -I../../../../communication -I../../../../events -I../../../../geometry -I../../../../graphics -I../../../../hmilogic/include -I../../../../sound -I../../../../util -O3 -Wall -Werror -c -fmessage-length=0 -fno-builtin -ffunction-sections -fdata-sections -std=gnu99 -mcpu=cortex-m3 -mthumb -MMD -MP -MF"touch/TouchEventQueue.d" -MT"touch/TouchEventQueue.d" -o"touch/TouchEventQueue.o" "C:/Users/my_user_name/Documents/My Project Verification build/src/touch/TouchEventQueue.c"
Finished building: C:/Users/my_user_name/Documents/My Project Verification build/src/touch/Touch.c
arm-none-eabi-gcc -D__REDLIB__ -DNDEBUG -D__CODE_RED -D__USE_CMSIS=CMSISv2p00_LPC177x_8x -I"C:\Users\my_user_name\Documents\My Project Verification build\src\build\RedSuite4NXP\CMSISv2p00_LPC177x_8x\inc" -I../../../../board -I../../../../board/lpc1788 -I../../../../communication -I../../../../events -I../../../../geometry -I../../../../graphics -I../../../../hmilogic/include -I../../../../sound -I../../../../util -O3 -Wall -Werror -c -fmessage-length=0 -fno-builtin -ffunction-sections -fdata-sections -std=gnu99 -mcpu=cortex-m3 -mthumb -MMD -MP -MF"touch/TouchPoint.d" -MT"touch/TouchPoint.d" -o"touch/TouchPoint.o" "C:/Users/my_user_name/Documents/My Project Verification build/src/touch/TouchPoint.c"

Finished building: C:/Users/my_user_name/Documents/My Project Verification build/src/touch/TouchEventQueue.c
Finished building: C:/Users/my_user_name/Documents/My Project Verification build/src/touch/TouchCalibration.c


Finished building: C:/Users/my_user_name/Documents/My Project Verification build/src/touch/TouchPoint.c

Building target: lib_touch.a
Invoking: MCU Archiver
arm-none-eabi-ar -rD "lib_touch.a"  ./touch/Touch.o ./touch/TouchCalibration.o ./touch/TouchEventQueue.o ./touch/TouchPoint.o   
c:\code_red\RedSuiteNXP_4.3.0_1033\redsuite\tools\bin\arm-none-eabi-ar.exe: creating lib_touch.a
Finished building target: lib_touch.a

make --no-print-directory post-build
Performing post-build steps
arm-none-eabi-size "lib_touch.a" ; cp "lib_touch.a" "../../../../lib/lib_touch.a"; # arm-none-eabi-objdump -h -S "lib_touch.a" >"lib_touch.lss"
   text    data     bss     dec     hex filename
   1864       0     156    2020     7e4 Touch.o (ex lib_touch.a)
    576       0       0     576     240 TouchCalibration.o (ex lib_touch.a)
    320       0       0     320     140 TouchEventQueue.o (ex lib_touch.a)
     96       0       0      96      60 TouchPoint.o (ex lib_touch.a)

更新:更多信息

我做了更多的挖掘,看起来完整的文件路径位于字符串常量的前面。 .a 文件中的路径数据显示

C:/Users/my_user_name/Documents/My Project Verification build/src/touch/Touch.c.TouchIdleTimer

我在文件 Touch.c 中有一个字符串文字“TouchIdleTimer”。是这个原因吗?我将如何删除路径部分,或者是否可能? TIA


Update

通过这个答案 https://stackoverflow.com/a/4156166/1085891 to GCC:仅静态链接一些库 https://stackoverflow.com/questions/4156055/gcc-static-linking-only-some-libraries

注意:如果您使用 .so 文件的完整路径,它将再次动态链接。


Code Red IDE v4 中增强的静态库支持:创建静态库项目 http://support.code-red-tech.com/CodeRedWiki/StaticLibrarySupportv4

搜索周围我看到的建议-fPIC or -fpic。被推荐了在这个评论线程中 http://www.techytalk.info/c-cplusplus-library-programming-on-linux-part-one-static-libraries/comment-page-1/#comment-4692回答与您类似的问题。

3.2 共享库和静态库 http://www.network-theory.co.uk/docs/gccintro/gccintro_25.html提供了编译共享库和静态库的详细分解。

您声明静态不是共享库,但以防万一:如何编写共享库 http://www.akkadia.org/drepper/dsohowto.pdf

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

gcc - 如何从静态库输出 (.a) 中删除所有绝对路径 的相关文章

随机推荐

  • 在 C++ 中将浮点值作为数组中的索引

    浮点值可以用作数组的索引吗 如果用作索引的表达式生成浮点值 会发生什么情况 float 值将被转换为 int 根据编译器的警告级别 它可能会给出警告或错误 s1 q 12 2 same as q 12 s2 q 12 999999 same
  • PhoneGap 是应用程序开发的好选择吗? [关闭]

    就目前情况而言 这个问题不太适合我们的问答形式 我们希望答案得到事实 参考资料或专业知识的支持 但这个问题可能会引发辩论 争论 民意调查或扩展讨论 如果您觉得这个问题可以改进并可能重新开放 访问帮助中心 help reopen questi
  • 什么是 .NET 程序集?

    什么是 NET 程序集 我浏览了网络 但无法理解其定义 程序集是 net 应用程序的最小部署单元 它可以是一个dll or an exe 它主要有两种类型 私人集会 dll 或 exe 是一个应用程序的专有财产 一般存放在应用程序根文件夹中
  • 以十六进制打印字符串? [关闭]

    很难说出这里问的是什么 这个问题是含糊的 模糊的 不完整的 过于宽泛的或修辞性的 无法以目前的形式得到合理的回答 如需帮助澄清此问题以便重新打开 访问帮助中心 help reopen questions 这种以十六进制打印字符串的简短方法是
  • RobolectricGradleTestRunner 与 RobolectricTestRunner.class

    在 roboelectric 中 当您编写测试类时 您已经声明了 RunWith 注释 其中有 RobolectricGradleTestRunner 和 RobolectricTestRunner class 有什么区别以及我们应该使用哪
  • 本地化:django-admin compilemessages 跳过 venv

    我正在使用本地化Django 1 11应用 我可以排除虚拟环境文件夹node modules文件夹 同时使用消息文件添加消息 i选项如 django admin makemessages l no i venv django admin m
  • Rails 4:带有 has_many 的复选框

    我正在构建一个必须将任务分配给多个雇主的应用程序 我已经构建了这些模型 assignment rb class Assignment lt ActiveRecord Base has many employer assignments ha
  • Windows Phone 8 中的 Webview 弹跳

    我需要知道是否有任何方法可以控制 Windows 8 中的 webview 弹跳属性 我已经尝试过 ms touch action none 它确实会停止弹跳 但会禁用应用程序中的整个滚动 我已尝试以下方法 但这些方法不起作用 backfa
  • Firestore分页-如何查找查询后是否有更多数据(使用限制)

    我们在当前的 python 2 7 标准环境中使用 ndb 数据存储 我们使用 firestore 本机模式 将此应用程序迁移到 python 3 7 标准环境 我们在 ndb 数据存储上使用分页并使用 fetch 构建查询 query r
  • Android,语言文件不起作用

    我现在正在创建一个 Android 应用程序 并尝试为我的母语添加语言文件 但在某种程度上 这对我不起作用 我尝试在两部不同的手机中加载该应用程序 但结果相同 之前创建过语言文件 效果良好 但这次不行 手机设置为瑞典语 语言文件适用于我创建
  • 如何从 JavaScript 中计算 HTML 表格的渲染高度?

    调整窗口大小时 我需要知道表格有多大 以便我可以动态地很好地适应中间的所有其他内容 表格高度仅取决于动态加载的内容 如何在 JavaScript 中计算表格的渲染高度 您可以使用element offsetHeight https deve
  • NSWorkspaceWillPowerOffNotification 从未被调用

    我正在尝试在后台进程中运行一个程序 该程序将注册系统中的每个关闭事件 通过注册 NSWorkspaceWillPowerOffNotification 来实现此目的 如下所示 import
  • 如何在同一台机器上运行 2 个(或更多)Wildfly 实例?

    我想通过运行 2 个独立的 Wildfly 实例来模拟 2 个服务器 当您不想在同一个实例上部署所有 WAR 然后只能将它们关闭并一起启动时 这非常有用 我正在将 Eclipse 与 JBoss 插件一起使用 在服务器视图中 我希望有 2
  • Javascript 与 Python 关于 Python 'map()' 函数的比较

    Python中有一个函数叫做map这可以让你去 map someFunction x y z 并继续应用该功能的列表 是否有与此功能等效的 JavaScript 我现在刚刚学习Python 虽然我被告知javascript是函数式语言 但我
  • Python 应用程序的最佳项目结构是什么? [关闭]

    Closed 这个问题需要多问focused help closed questions 目前不接受答案 想象一下 您想要用 Python 开发一个重要的最终用户桌面 不是 Web 应用程序 构建项目文件夹层次结构的最佳方法是什么 理想的特
  • Eclipse 依赖项目未复制到 WTP 部署

    在我们开始使用 Gradle 之前 Eclipse 中的多项目 10 12 开发工作已通过 WTP 项目成功部署到内部 Tomcat 7 服务器之一 我们发现这对于开发非常有用 Gradle 启动并运行后 依赖项目的 jar 文件不再被复制
  • 如何在asp mvc的视图中加载选定的partialview?

    我正在从事 ASP NET Mvc 项目 我有一个类似于图像的视图 在此输入图像描述 https i stack imgur com xI6Fa jpg 我在布局中设计了右侧面板 我的布局代码 div class col md 3 pane
  • 将寻呼机视为列表视图行项目

    我有一个包含 20 行的列表视图 我想为列表视图中的每一行设置一个视图寻呼机 由于列表视图的行中的项目可能是一个或多个 并且我想使用视图分页器显示列表视图行项目 为此 我使用以下代码 将显示在列表视图行中的自定义布局 作为分页器项目
  • Moxy、JSON 和 Jersey 2.0 不会反序列化纯字符串数组

    在我当前的设置中 我使用 Jersey 2 0 和 MOXy 如中所述球衣文档 https jersey java net documentation latest media html json moxy 我完全依赖于 自动发现的功能 所
  • gcc - 如何从静态库输出 (.a) 中删除所有绝对路径

    我正在使用 GCC for ARM 红色套件 4 恩智浦 http www code red tech com red suite 4 nxp php 我正在编译用于最终应用程序的静态库文件 a 我需要配置项目 以便任何开发人员都可以生成完