我正在开发一个小的OpenMP工具库,它允许我利用OpenMP回调。这个库完全用C编写。我可以编译它并将其链接到我的用户代码中。为了编译库,我在Makefile
中使用以下命令:
CC = clang
CFLAGS =-O3 -fopenmp
LDLIBS =-lomp
libompt.so: counter.c ompt.c
$(CC) $(CFLAGS) -shared -fPIC $^ -o $@
为了静态或动态地编译我的小例子,我在Makefile
中有这些目标:
test_daxpy_sta: counter.c ompt.c daxpy.c test_daxpy.c
$(CC) $(CFLAGS) $(LDLIBS) $^ -o $@
test_daxpy_dyn: daxpy.c test_daxpy.c libompt.so
$(CC) $(CFLAGS) -L. -lompt $(LDLIBS) $^ -o $@
所有工作都很好。现在我想在OpenMP on_ompt_callback_thread_begin()
和on_ompt_callback_thread_end()
回调中使用C对象及其方法。为了实现这一点,我需要用C编译器编译我的小OpenMP工具库。对上述命令的唯一更改是:
CC = clang++
使用clang++
编译的OpenMP工具不再工作。它不注册回调,也不在后台执行任何“分析”工作。我不知道为什么。在C++代码中启用带有回调的OpenMP工具的正确方法是什么?
我用clang
和clang++
编译了我的库和静态和动态可执行文件。然后我在我的库和可执行文件上使用了ldd
。唯一的区别是用clang++
编译的test_daxpy_sta
使用了libgcc_s.so.1 => /usr/lib/libgcc_s.so.1
。这是正确的吗?clang++
不应该依赖于libgcc_s
的LLVM等价物吗?我找到了clang++
选项--rtlib
,但我不知道GNU的libgcc_s
的LLVM对应物是什么。
1条答案
按热度按时间hrysbysz1#
OpenMP运行时通过搜索名为
ompt_start_tool
[1]的全局可见函数来加载工具。如果使用C++编译器编译工具,请确保将此函数声明为extern "C"
,以便函数名称不会被损坏,并且OpenMP运行时可以找到[2]。您可以使用
nm
命令检查ompt_start_tool
函数是否已损坏,以查看编译库中定义的符号:nm libompt.so | grep ompt_start_tool
作为诊断OpenMP工具加载的附加提示,您可以使用
OMP_TOOL_VERBOSE_INIT
环境变量来诊断运行时检测和加载工具的问题**[3]**。这将帮助您验证运行时是否能够找到并加载您的工具。参考文献
[1]https://www.openmp.org/spec-html/5.0/openmpsu177.html
**[2]**https:isocpp.org/wiki/faq/mixing-c-and-cpp#call-cpp
[3]https://www.openmp.org/spec-html/5.1/openmpse77.html