As referred in The first gcc bug I ever meet, I upgraded gcc to the newest 7.1.0 version to conquer building OpenMP errors. But unfortunately, when using taskloop clause, weird issue happened again. My application utilizes HElib, and I just added following statement in a source file:

#pragma omp taskloop

Then the strange link error reported:

In function `EncryptedArray::EncryptedArray(EncryptedArray const&)': /root/Project/../../HElib/src/EncryptedArray.h:539: undefined reference to `cloned_ptr<EncryptedArrayBase, deep_clone<EncryptedArrayBase> >::cloned_ptr(cloned_ptr<EncryptedArrayBase, deep_clone<EncryptedArrayBase> > const&)' collect2: error: ld returned 1 exit status

I tried to debug it, nevertheless, nothing valuable was found.

So I attempted to use clang . Install it on ArchLinux like this:

# pacman -S clang resolving dependencies... looking for conflicting packages... Packages (2) llvm-libs-4.0.0-3 clang-4.0.0-3 Total Download Size:53.24 MiB Total Installed Size: 275.24 MiB :: Proceed with installation? [Y/n] y ...... checking available disk space [#########################################] 100% :: Processing package changes... (1/2) installing llvm-libs [#########################################] 100% (2/2) installing clang [#########################################] 100% Optional dependencies for clang openmp: OpenMP support in clang with -fopenmp python2: for scan-view and git-clang-format [installed] :: Running post-transaction hooks... (1/1) Arming ConditionNeedsUpdate...

Unlike gcc , to enable OpenMP feature in clang , we need to install an additional openmp package:

# pacman -S openmp

Write a simple program:

# cat parallel.cpp #include <stdio.h> #include <omp.h> int main(void) { omp_set_num_threads(5); #pragma omp parallel for for (int i = 0; i < 5; i++) { #pragma omp taskloop for (int j = 0; j < 3; j++) { printf("%d

", omp_get_thread_num()); } } }

Compile and run it:

# clang++ -fopenmp parallel.cpp # ./a.out 0 0 0 0 0 1 1 2 4 4 4 4 3 0 1

Clang OpenMP works as I expected. Build my project again, no eccentric errors! Work like a charm!