给定以下文件print.cpp:
#include <stdio.h>
int main() {
printf("asdf\n");
}
我可以像这样静态链接:
我可以像这样静态链接:
g++ -static print.cpp
or like this
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说:
然而,既然在基于glibc的系统上,由于底层pthread实现的限制,OpenMP启用的应用程序无法进行静态链接。
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
libgcc
不是全部,libgomp
也不是其中的一部分。 - Vladimir F Героям слава