将 OpenMP 与 GCC 静态链接

2023-12-14

给出以下文件 print.cpp

#include <stdio.h>
int main() { 
    printf("asdf\n");
}

我可以像这样静态链接

g++ -static print.cpp

或者像这样

g++ -static-libgcc -Wl,-Bstatic -lc print.cpp -o print

但现在让我们添加一点 OpenMP 并调用文件 print_omp.cpp

#include <omp.h>
#include <stdio.h>
int main() { 
    printf("%d\n", omp_get_num_threads());
}

我可以像这样静态链接它(我用它检查过ldd)

g++ -fopenmp -static print_omp.cpp

然而,这不起作用

g++ -fopenmp -static-libgcc -Wl,-Bstatic -lc print_omp.cpp -o print

我尝试过各种组合-Wl,--整个存档 -lpthread -Wl,--无整个存档和 -lgomp -lpthread 但没有运气(我在链接到 pthreads 时遇到各种问题)。有人可以解释一下我如何在不使用的情况下做到这一点-static option?

GCC says

在基于 glibc 的系统上,由于底层 pthreads 实现的限制,启用 OpenMP 的应用程序无法静态链接

然而,自从g++ -fopenmp -static print_omp.cpp工作得很好,这对我来说没有意义。

Edit: 我明白了这一点。库 GOMP 随 GCC 一起提供,而 pthreads 和 libc 来自 GLIBC。所以我可以像这样静态链接 GOMP

ln -s `g++ -print-file-name=libgomp.a`
g++ foo.cpp -static-libgcc -static-libstdc++ -L. -o foo -O3 -fopenmp

ldd 显示

linux-vdso.so.1 =>  (0x00007fff71dbe000)
libpthread.so.0 => /lib/x86_64-linux-gnu/libpthread.so.0 (0x00007fc231923000)
libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007fc23155c000)
/lib64/ld-linux-x86-64.so.2 (0x00007fc231b5c000)

但是,如果我尝试这个

ln -s `g++ -print-file-name=libpthread.a`
g++ foo.cpp -static-libgcc -static-libstdc++ -L. -o foo -O3 -fopenmp

它不会链接。Pthreads 和 libc 必须静态链接在一起。所以一旦我添加

ln -s `g++ -print-file-name=libc.a`
g++ foo.cpp -static-libgcc -static-libstdc++ -L. -o foo -O3 -fopenmp

ldd 返回

not a dynamic executable

我真的不明白为什么你可能只想链接libgomp静态地,但是使用单独的编译和链接命令可能会有所帮助。例如假设main.cpp包含:

#include <omp.h>
#include <stdio.h>

int main() { 
#pragma omp parallel
  {
    printf("%d\n", omp_get_thread_num());
  }
}

Then:

~/tmp$ ls
main.cpp
~/tmp$ g++  -Wall -Werror -pedantic  -fopenmp main.cpp  -c
~/tmp$ ls
main.cpp  main.o
~/tmp$ locate libgomp.a
${SOME_PATH_TO_LIBGOMP}/libgomp.a
~/tmp$ g++  -Wall -Werror -pedantic main.o -o main.x ${SOME_PATH_TO_LIBGOMP}/libgomp.a -pthread
~/tmp$ ls
main.cpp  main.o  main.x
~/tmp$ ldd main.x
    linux-gate.so.1 =>  (0xb7747000)
    libstdc++.so.6 => /production/install/gnu/compiler/gcc/lib/libstdc++.so.6 (0xb765c000)
    libm.so.6 => /lib/i386-linux-gnu/libm.so.6 (0xb75fa000)
    libgcc_s.so.1 => /production/install/gnu/compiler/gcc/lib/libgcc_s.so.1 (0xb75de000)
    libpthread.so.0 => /lib/i386-linux-gnu/libpthread.so.0 (0xb75c2000)
    libc.so.6 => /lib/i386-linux-gnu/libc.so.6 (0xb7413000)
    /lib/ld-linux.so.2 (0xb7748000)
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

将 OpenMP 与 GCC 静态链接 的相关文章

  • gcc 删除内联汇编代码

    看起来 gcc 4 6 2 删除了它认为函数中未使用的代码 test c int main void goto exit handler asm volatile jmp 0x0 exit return 0 拆解main 0x0804840
  • 如何使用 mingw gcc 链接 msvcr90.dll?

    如何使用 mingw gcc 链接 msvcr90 dll 我尝试了 lmsvcr90 这是最小的示例 include
  • GCC:如何在 MCU 上完全禁用堆使用?

    我有一个在基于 ARM Cortex M 的 MCU 上运行并用 C 和 C 编写的应用程序 我用gcc and g 编译它并希望完全禁用任何堆使用 在 MCU 启动文件中 堆大小已设置为 0 除此之外 我还想禁止代码中意外使用堆 换句话说
  • C++ Linux GCC 应用程序中的 GUID

    我有很多服务器运行这个 Linux 应用程序 我希望他们能够生成一个碰撞概率较低的 GUID 我确信我可以从 dev urandom 中提取 128 个字节 这可能没问题 但是有没有一种简单易用的方法来生成与 Win32 更等效的 GUID
  • OpenMP 超线程导致性能不佳:如何将线程绑定到核心

    我正在开发大型密集矩阵乘法代码 当我分析代码时 它有时会达到我的四核系统的峰值失败率的 75 而其他时候则达到约 36 代码执行之间的效率不会改变 它要么从 75 开始 并继续保持该效率 要么从 36 开始 并继续保持该效率 我已将问题追溯
  • CC、gcc 和 g++ 之间的区别?

    CC gcc g 这3个编译器在编译时有什么区别 汇编语言中的 C 和 C 代码 代码生成 可用库 语言特性等 这个问题的答案是特定于平台的 例如 Linux 上发生的情况与 Solaris 上发生的情况不同 最简单的部分 因为它不是特定于
  • _MM_TRANSPOSE4_PS 在 GCC 中导致编译器错误?

    我第一次在 GCC 而不是 MSVC 中编译我的数学库 并经历了所有的小错误 我遇到了一个根本没有意义的错误 Line 284 error lvalue required as left operand of assignment 284号
  • 嵌入式系统中的malloc [重复]

    这个问题在这里已经有答案了 我正在使用嵌入式系统 该应用程序在 AT91SAMxxxx 和 cortex m3 lpc17xxx 上运行 我正在研究动态内存分配 因为它会极大地改变应用程序的外观 并给我更多的力量 我认为我唯一真正的路线是为
  • 如何为大量标头生成 .pch?

    我的代码一直使用 libcxx sdl 和其他一些库 考虑到每个标头可以包含一些其他标头 即使具有像 ifdef include endif 这样的复杂条件 我如何生成 pch 这就是为什么很难理解所需的头文件列表 我应该只使用在中找到的所
  • 在 omp 并行 for 循环中使用 unique_ptr 会导致 SEG.FAULT

    采取以下代码 include
  • 使用 CMake 在 iOS 中使用另一个 STATIC 库创建一个 STATIC 库

    我有一个 libfooi a 的集合 libfoo1 a libfoo2 a libfoo3 a 使用工厂 带有静态代码 有一个公共接口来创建 C 对象 使用 CMake 我选择其中之一 并创建一个链接它并添加所有内容的 libfooWra
  • 如何防止函数被优化

    我正在优化整个代码 但我不希望优化某个函数 例如出于调试目的 有没有办法在 gcc 3 4 编译器上做到这一点 最简单的方法是将函数放入其自己的编译单元中 在没有优化标志的情况下编译该单元 最近的 gcc 版本 我认为是 4 4 有一个属性
  • 使用Address Sanitizer和gcc7.1.0时如何生成核心转储

    我编译了我的代码 fsanitize address在 CentOS 7 2 1511 上 当我将 gcc 更新到 7 1 0 时 它无法再生成核心转储文件 有谁能够帮助我 gcc编译选项 lm g3 Wall Wno unknown pr
  • 为什么 GCC 6.3 在没有显式 C++11 支持的情况下编译此 Braced-Init-List 代码?

    我有一个问题大括号括起来的列表的不同含义 https stackoverflow com q 37682392 2642059 我知道C 03不支持C 11initializer list 然而 即使没有 std c 11编译器标志 gcc
  • GCC 内联 asm NOP 循环在编译时未展开

    走出我通常的 VC 领域 进入 GCC 的世界 通过 MINGW32 尝试创建一个主要由 NOP 组成的 Windows PE ala for i 0 i lt 1000 i asm nop 但要么我使用了错误的语法 要么编译器正在通过它们
  • 我需要一个树转储选项,该选项在当前的 gcc 版本中不再存在

    旧版本的 GCC 例如 4 0 2 或 4 1 2 有该选项 df see 用于调试程序或 GCC 的选项对于4 1 2 http gcc gnu org onlinedocs gcc 4 1 2 gcc Debugging Options
  • 初始化变量以减少 OMP

    OpenMP 标准指定了缩减变量的初始值 那么我是否必须初始化该变量以及在以下情况下如何执行此操作 int sum for int it 0 i
  • g++、colorgcc 和 ccache

    尝试结合 ccache 和 colorgcc 下列的链接文本 http wiki tudos org Gcc stack 我的 g 是到 colorgcc 的软链接 colorgccrc 包含行 g ccache usr bin g 运行
  • 通过 VLA 数组跳转到 goto 时出现分段错误

    以下示例演示了该问题 include
  • 让 GCC/Clang 使用 CMOV

    我有一个简单的标记值联合 这些值可以是int64 ts or doubles 我正在对这些联合进行加法 但需要注意的是 如果两个参数都代表int64 t值 那么结果也应该有一个int64 t value 这是代码 include

随机推荐