【发布时间】:2014-05-26 12:16:03
【问题描述】:
给定以下文件 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 的各种组合,但没有运气(我在链接到 pthread 时遇到各种问题)。有人可以解释我如何在不使用 -static 选项的情况下做到这一点吗?
在基于 glibc 的系统上,由于底层 pthreads 实现的限制,支持 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不是其中的一部分。
标签: gcc openmp static-linking