gpt4 book ai didi

gcc - 将 OpenMP 与 GCC 静态链接

转载 作者:行者123 更新时间:2023-12-04 20:40:02 34 4
gpt4 key购买 nike

给定以下文件 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,--whole-archive -lpthread -Wl,--no-whole-archive 的各种组合和 -lgomp -lpthread 但没有运气(我在链接到 pthreads 时遇到各种问题)。有人可以解释我如何在不使用 -static 选项的情况下做到这一点吗?

GCC says

On glibc-based systems, OpenMP enabled applications cannot be statically linked due to limitations of the underlying pthreads-implementation

但是,由于 g++ -fopenmp -static print_omp.cpp 工作正常,这对我来说没有意义。

编辑:我想通了。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());
}
}

然后:

~/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)

关于gcc - 将 OpenMP 与 GCC 静态链接,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23869981/

34 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com