msys2 / MINGW-packages

Package scripts for MinGW-w64 targets to build under MSYS2.
https://packages.msys2.org
BSD 3-Clause "New" or "Revised" License
2.25k stars 1.21k forks source link

clang vs libtool not linking -lomp when using -fopenmp #8554

Open jeremyd2019 opened 3 years ago

jeremyd2019 commented 3 years ago

libraw and adol-c use openmp, but seem to not link in -lomp for some reason. I believe it's due to libtool passing -nostdlib, and not -lomp.

Example:

/bin/sh ../libtool --tag=CXX --mode=link g++ -march=x86-64 -mtune=generic -O2 -pipe -version-info 4:0:2 -no-undefined -pipe -Wl,--dynamicbase -L/clang64/lib -lboost_system-mt -o libadolc.la -rpath /clang64/lib dummy.lo src/libadolcsrc.la src/drivers/libdrivers.la src/tapedoc/libtapedoc.la src/lie/liblie.la

libtool: link: g++ -shared -nostdlib C:/msys64/clang64/x86_64-w64-mingw32/lib/dllcrt2.o C:/msys64/clang64/x86_64-w64-mingw32/lib/crtbegin.o .libs/dummy.o -Wl,--whole-archive src/.libs/libadolcsrc.a src/drivers/.libs/libdrivers.a src/tapedoc/.libs/libtapedoc.a src/lie/.libs/liblie.a -Wl,--no-whole-archive -L/clang64/lib -lboost_system-mt -LC:/msys64/clang64/x86_64-w64-mingw32/lib -LC:/msys64/clang64/lib -LC:/msys64/clang64/x86_64-w64-mingw32/sys-root/mingw/lib -LC:/msys64/clang64/lib/clang/11.0.0/lib/windows -lc++ -lmingw32 C:/msys64/clang64/lib/clang/11.0.0/lib/windows/libclang_rt.builtins-x86_64.a -l:libunwind.dll.a -lmoldname -lmingwex -lmsvcrt -ladvapi32 -lshell32 -luser32 -lkernel32 -lmingw32 C:/msys64/clang64/lib/clang/11.0.0/lib/windows/libclang_rt.builtins-x86_64.a -l:libunwind.dll.a -lmoldname -lmingwex -lmsvcrt -lkernel32 C:/msys64/clang64/x86_64-w64-mingw32/lib/crtend.o -march=x86-64 -mtune=generic -O2 -Wl,--dynamicbase -fopenmp -o .libs/libadolc-2.dll -Wl,--enable-auto-image-base -Xlinker --out-implib -Xlinker .libs/libadolc.dll.a

lld-link: error: undefined symbol: omp_get_thread_num

mati865 commented 3 years ago

When using -fopenmp GCC will pass -lgomp even with -nostdlib. Clang passes -lomp only when there is no -nostdlib.

jeremyd2019 commented 3 years ago

yes it works :)

  # clangs -fopenmp defaults to libgomp unless explicitly specified to link to libomp,
  # it also disables omp use if -nostdlib is specified so we force it ugh...
  if [ "${_compiler}" == "clang" ]; then
    CFLAGS+=" -fopenmp"
    CXXFLAGS+=" -fopenmp"
    LDFLAGS+=" -fopenmp=libomp"
  fi

no need for it in LIBS anymore.

Originally posted by @revelator in https://github.com/msys2/MINGW-packages/discussions/7589#discussioncomment-707495

jeremyd2019 commented 3 years ago

In the above comment, I never did verify that that did work, I was just reposting the comment here where it was more relevant