问题标签 [linker-flags]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
xcode8 - 构建阶段之间的差异 -> 将二进制文件与库或构建设置链接 -> 链接器标志
Build Phases -> Link Binary with Libraries 或 Build Settings -> Linker Flags 有什么区别?
前者似乎不允许您在 Debug 与 Release 之间进行指定,并且其中指定的框架似乎也与后者不匹配。
注意:我已经检查了 SO 上的现有帖子,还没有找到准确回答这个问题的帖子。
c++ - “library-path”、“rpath”和“rpath-link”背后的基本原理和预期用途
我注意到很多人,包括我在内,并不准确了解链接器搜索路径背后的基本原理和预期用途:“library-path”、“rpath”和“rpath-link”。有人可以向我们解释一下吗?
语境
经过我所有的阅读,我倾向于认为'library-path'和'rpath'就足够了。'rpath-link' 的基本原理和预期用途对我来说是个谜。让我解释一下为什么。设置 'library-path' 将指定的路径传递给链接器,以在链接(/构建)时
在指定路径中查找库。
设置“rpath”将指定的路径存储在构建的可执行文件中,链接器随后会在应用程序运行时(即运行时)查看指定的路径。
因此,如果您的库位于非标准位置,那么您需要指定“library-path”来构建可执行文件并指定“rpath”来运行它。
现在 GNU 链接器文档说:“-rpath 和 -rpath-link 之间的区别在于 -rpath 选项指定的目录包含在可执行文件中并在运行时使用,而 -rpath-link 选项仅在链接时有效。 "
这提出了两个问题:
1) 如果 'rpath-link' 中的 'r' 代表 'runtime',那么名称 'rpath-link' 似乎具有误导性,因为它是在链接时使用的。
2) 我已经在“库路径”中为链接时间指定了我的库目录。我认为“rpath-link”没有用。奇怪的现实:来自http://www.kaizou.org/2015/01/linux-libraries/我知道“库路径”不用于辅助依赖项(从一个共享库到另一个共享库的依赖项)。要解决这些次要依赖项,您需要设置“rpath”或“rpath-link”。那么我的问题是:您可能不使用“library-path”来指定辅助依赖项而是必须使用“rpath-link”的原因是什么?
我是如何偶然发现这个问题的
我有一个名为 app 的可执行文件,它想要使用 liba.so 中的功能,所以我将 app 链接到 liba.so。liba.so 依赖于 libb.so。liba.so 和 libb.so 都位于 mylibs 目录中。当我想构建我的可执行文件时,我遇到了以下消息:
其次是几个未定义的参考错误。
为了正确构建它,我必须将'library-path'和'rpath-link'(或'rpath')都设置到目录mylibs。我很困惑为什么“库路径”也不能用于搜索二级依赖项 libb.so,并且必须设置一个额外的“rpath-link”来搜索这个二级依赖项。
相关问题: -rpath-link 的基本原理
c - GNU g++ -G 选项用于创建在 Solaris 上而不是在 Linux 上可用的共享库
我g++ 4.9.2 compiler
在Solaris
和Linux
. 在 Solaris 平台上,要从源文件 (ac) 创建共享库,我使用以下命令:
a
成为共享库
a.c
包含以下代码:
如果我尝试不使用 -G 选项,即编译为:
它得到一个链接器错误:Undefined Symbol main
但是,在 Linux 上,如果我做同样的事情:它会说:
如何在 Linux 上创建共享库?有什么g++
选择?
linker - arm-none-eabi-ld 和 -z muldefs,符号优先级
我正在使用 arm-none-eabi-ld 为一个非常具体的嵌入式架构链接一堆目标文件(具体来说是 Gameboy Advance)——我必须引用一堆已经定义的符号,以实现我我正在链接定义这些的脚本(例如整数除法,但结构/结构数组之类的东西也在那里)
出于我的目的,存在一个链接器脚本,它已经预定义了一堆这些符号,并且可以用作某种“共享链接器脚本”,以便构建不同的项目并将其集成到另一个项目中。问题是,它还定义了一堆我想在源文件中重新定义的符号。举一个实际的例子:
链接器脚本定义pokemon_front_sprites
(它是一个类型的数组void*
) - 但我也定义pokemon_front_sprites
了 - 所以我决定用编译-z muldefs
来避免它。如果两个符号指向不同的数据,当然会出现问题。
我现在的问题如下:我可以告诉 ld 喜欢我的符号而不是预定义的符号吗?与 链接时,我可以以某种方式分配优先级-T <script>
吗?
c++ - QMake - 如何以及在何处添加链接器标志?
我尝试在.pro
我们项目的文件中添加以下内容:
我收到一个错误LINK : warning LNK4044: Nicht erkannte Option /Wl,--large-address-aware; wird ignoriert.
翻译: unrecognised option /Wl,--large-address-aware; gets ignored.
在此之前,我试图找出在哪里添加链接器选项,但它似乎只是放入文件中的普通变量.pro
。我还搜索了一个搜索代码条目,其中该选项是.pro
文件的一部分。
根据这篇文章,我添加了增加 32 位应用程序内存限制的选项...
如何应用选项功能?
cmake - 使用 set_target_properties 和 LINK_FLAGS 时缺少目标的链接标志
我们有三个目标。一个是静态库,一个是共享库,一个是程序。我们正在尝试将目标特定的链接器标志添加到共享库和程序中。
当我们尝试附加我们需要的标志时:
它导致失败:
X = ${X} Y
当我们由于缺少 而尝试使用语法时+= operator
,属性会被静默删除:
例如,mapfile 丢失了,所以在 Solaris 下测试早期 Xeon 的结果是:
这是set_property
,set_target_properties
和的文档LINK_FLAGS
。他们没有提供必要的细节,也没有提供示例。医生set_target_properties
特别迷人。
我们如何添加目标特定的链接标志?
c++ - 如何使用 `--wrap` 选项正确包装函数?
gcc 6.3 的手册页说:
所以我创建了一个简单的例子:
并编译它:
这给了我一个警告:
进展顺利。现在我建议这样的输出:
相反,我得到了这个:
我希望事情很清楚。我对警告感到困惑。通常,该__real
函数应由链接器链接到foo()
. 此外,调用foo()
应该链接到__wrap_foo
. 但是输出显示,它foo()
正在被执行。
如何--wrap
正确使用?
gcc - 加载共享库失败,符号未定义:__gcov_merge_add 错误
我正在尝试将 gcov 集成到现有的构建环境中。将 -fprofile-arcs 和 -ftest-coverage 添加到 CXXFlags 使我能够毫无问题地构建和生成 .gcno 静态文件。但是一旦我开始部署这个包,我就会遇到以下错误,无法加载共享库
错误消息未定义符号:__gcov_merge_add
有人可以帮我调试为什么缺少这个符号定义。
提前致谢!。
mysql - 链接器错误:ld:找不到 -lssl 的库
在 macOS High Sierra 10.13.1 上链接我的程序时,我收到一条错误消息
链接器标志在 makefile-lssl
中返回:mysql_config
makefile 已经运行了很长一段时间,所以我怀疑这个问题是由于最近升级 macOS 引起的。我还将mysql更新到最新版本5.7.20,但这并没有解决问题。