问题标签 [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.
linux - CMake - 如何在链接器命令行中避免 CMAKE_CXX_FLAGS
我在使用 cmake / gcc / Linux 时遇到问题。
无论我尝试什么,我都无法摆脱链接器行上的 CMAKE_CXX_FLAGS 。在链接模式下调用 g++ 时,CMake 会不断传递它们。
我的 CMAKE_CXX_FLAGS 中有 -fopenmp 并且它不能出现在链接行上,因此 g++ 不会链接到 gomp(我使用的是英特尔的 iomp5)。
编辑:我尝试了以下 CMakeLists.txt 的开头,没有帮助:
谢谢
c++ - 源编译为“共享库”
我有一个简单的源文件'source.cpp:
现在我正在编译它:
结果在 Thunar 中显示为“共享库”类型。我可以使用 ./out 在 Shell 中运行它,但不能通过双击在 Thunar 中运行它。
ldd 说:
当我设置 -static 标志时,我得到一个典型的“程序”,它按预期在 Thunar 中工作,但肯定更大。ldd 说“程序没有动态链接”
几年前,我编译了这个源代码,但我不记得编译器选项了,我在 Typ 'Program' 中得到了一个没有静态链接的结果。ldd 说的和第一个例子一样。
那么,我该怎么做才能获得类型为“程序”的可执行文件,该可执行文件可以通过在文件管理器中双击来执行。
(我当然在所有示例中都设置了可执行标志)
gcc - 强制链接器/C 编译器包含已定义但未使用的内联函数?
我的项目由一个.c
文件和一个文件中的数学库组成.h
,所有函数都声明为 inline。并非数学库中的每个函数都在主程序中使用。这些函数不会编译到可执行文件中。
但是,一些未使用的函数在调试中可能仍然有用,因为 gdb 的print
语句可以计算任意表达式。有没有办法强制在最终的可执行文件gcc
中包含所有定义的函数,包括inline
函数,即使它们没有被使用?
(我没有使用任何-O
标志。这两种情况都会发生clang
和gcc
。我必须引入单独的链接步骤的解决方案很好。)
compilation - 使用 pgi 和 gcc 编译器重定位被截断为 fir 错误
gcc(7.2.0) 和 pgi(18.4) 编译器出现错误。我正在编译一个科学应用程序(在 fortran 中),它有一些依赖项。这些依赖项是使用 -fPIC 标志编译的。在编译主应用程序时,我收到一个错误“relocation truncated to fit”。当我添加标志 -mcmodel=medium(pgi) 时,编译成功。但是由于某些原因我不愿意添加这个标志。此外,当我使用 -fPIC 编译主应用程序时,我得到链接器错误和添加 --no-relax 标志的建议。添加相同的内容后,我仍然收到重定位错误。有没有什么方法可以在没有 -mcmodel=medium 标志的情况下编译?
编辑: 另外,当使用 gnu 编译器时,无论我使用什么 mcmodel,我都会收到重定位错误。这可能与旧链接器有关吗?因为我认为,应用程序及其依赖项是使用 64 位库编译的,而链接器是我假设使用 32 位库运行的。作为在执行 /ld-linux.so --list 时使用 pgi 成功编译的原因,我收到一条错误消息,指出无法映射到零填充页面。在运行可执行文件时,我收到一条消息,如 Killed。
cmake - 如何将链接器选项添加到 CMake 引导程序?
我正在从 AIX 上的发布 tarball 构建 CMake 3.12.4。CMake 无法在机器上链接:
该错误在 IBM 技术说明中的ld: 0711-781 ERROR: TOC overflow中有详细说明。我想-bbigtoc
为 cmake 配方添加链接器选项。
CMake 的引导程序似乎不接受LDFLAGS
如下所示的链接器选项。
如何将链接器标志添加到引导进程?
以下是 CMake 引导程序接受的选项:
这是 CMake 链接错误:
gcc - 在链接器脚本中定义了内存来源和长度
假设我在上面的链接器脚本中有一个部分。我可以定义 0x80000000 和 34K。我希望它看起来像,
所以我的问题是如何将这个定义放在链接器脚本中?我有一个自动生成链接器脚本的脚本,并且每次定义都会有所不同。
gcc - 我怎样才能让LD始终将入口点放在-Ttext的位置?
我正在编写自己的操作系统(静态地址),并且我很难让链接器始终将我的_start
函数放在进程中我想要的位置。我在我的构建文件中指定了位置-Ttext 0x10000
(在这个例子中我们只说 0x10000)。
通常这是可行的,但是当我使用-O2
链接器时,会将我的main
函数放在这个地址上。
那么我怎样才能确保它_start
最终出现在这个地址上呢?是否可以不编写链接器脚本?
该函数_start
对所有进程都是通用的,并且在程序返回而不是调用exit()
. 我脑子里有一个解决方案,但我更愿意用链接器来代替它。
shared-libraries - 如何在运行路径标志中针对 $ORIGIN 指定共享库的目录?
该网页告诉我,我们可以使用$ORIGIN
将可执行文件的目录作为搜索目录烘焙到可执行文件中。这条runpath
命令可以写成:
但是我试图加载的共享库与可执行文件并不完全相同。它位于LIB
可执行文件所在的子目录中。该网页没有告诉我该怎么做。我尝试了许多连接 LIB 的方法,但都无济于事,例如 "\$ORIGIN/LIB"、"\$ORIGIN"/LIB、\$ORIGIN/LIB 或 "\$ORIGIN/LIB/"。我也没有从谷歌搜索中找到任何线索。你能告诉我 $ORIGIN 在运行路径标志中指定相对于它的目录的正确语法吗?谢谢你。
PS:我正在使用 GNU make 4.1 和 GNU ld 2.26.1 开发 ubuntu 16.04。