给出以下文件 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