对于OpenMP,当我的代码使用其API中的函数(例如,omp_get_thread_num())而不使用其指令(例如#pragma omp ...)时,
为什么直接将libgomp.a指定为gcc而不是使用-fopenmp不起作用,例如
gcc hello.c /usr/lib/gcc/i686-linux-gnu/4.4/libgomp.a -o hello
Run Code Online (Sandbox Code Playgroud)
更新:我刚刚发现链接到libgomp.a不起作用,但链接到libgomp.so工作.这是否意味着OpenMP不能静态链接?
为什么-fopenmp只能在不指定库文件的情况下工作
gcc hello.c -fopenmp -o hello
Run Code Online (Sandbox Code Playgroud)
更新:换句话说,当使用-fopenmp时,为什么不需要显式链接到libgomp.so?
为什么这也编译:
gcc hello.c -L/usr/lib/gcc/i686-linux-gnu/4.4/ -lgomp -o hello
Run Code Online (Sandbox Code Playgroud)
如果有的话,这会忽略代码中的OpenMP指令吗?
感谢致敬!
Chr*_*ick 25
一般来说,请记住指令和功能是不同的东西; 前者受控制,-fopenmp后者通过链接到OpenMP库来控制.
(已更新以合并注释)尝试使用-fopenmp和-static选项静态链接OpenMP.因为这意味着-lgomp -lrt,除非您还指定了以下命令,否则以下命令将无法正确编译librt.a.
gcc hello.c /usr/lib/gcc/i686-linux-gnu/4.4/libgomp.a -o hello
Run Code Online (Sandbox Code Playgroud)(更新以合并注释)我想以下命令正在正确编译,因为OpenMP库已经在您的库路径中,并且您的系统的动态链接器正在自动链接libgomp.so.
gcc hello.c -fopenmp -o hello
Run Code Online (Sandbox Code Playgroud)以下命令可能正在正确编译,因为它链接到OpenMP(libgomp.so)的共享对象.请注意,不使用该-static选项.
gcc hello.c -L/usr/lib/gcc/i686-linux-gnu/4.4/ -lgomp -o hello
Run Code Online (Sandbox Code Playgroud)
如果未指定该-fopenmp选项,则应忽略OpenMP指令.