OpenMP with -m32 flags fails to find 32bit library and tries to use 64bit.
When trying to use OpenMP in a 32bit build with find_package(OpenMP REQUIRED)
, it tries to link with the 64bit library instead. It should be reproducible with this:
cmake_minimum_required(VERSION 3.20)
project(test_32bit_openmp LANGUAGES CXX)
find_package(OpenMP REQUIRED)
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -m32")
include(CheckCXXSourceCompiles)
set(CMAKE_REQUIRED_FLAGS "-m32")
set(CMAKE_REQUIRED_LIBRARIES OpenMP::OpenMP_CXX)
check_cxx_source_compiles(
"
#include <omp.h>
int main(void) {
omp_get_max_threads();
return 0;
}
"
RESULT_VAR
)
if(NOT RESULT_VAR)
message(SEND_ERROR "check_cxx_source_compiles with openmp failed!")
endif()
error logs show:
Performing C++ SOURCE FILE Test RESULT_VAR failed with the following output:
Change Dir: cmake-openmp/build-test/CMakeFiles/CMakeTmp
Run Build Command(s):/usr/bin/ninja cmTC_2716f && [1/2 100.4/sec] Building CXX object CMakeFiles/cmTC_2716f.dir/src.cxx.o
[2/2 149.2/sec] Linking CXX executable cmTC_2716f
FAILED: cmTC_2716f
: && /usr/bin/c++ -m32 -m32 CMakeFiles/cmTC_2716f.dir/src.cxx.o -o cmTC_2716f /usr/lib/gcc/x86_64-linux-gnu/7/libgomp.so /usr/lib/x86_64-linux-gnu/libpthread.so && :
/usr/bin/ld: /usr/lib/gcc/x86_64-linux-gnu/7/libgomp.so: error adding symbols: file in wrong format
collect2: error: ld returned 1 exit status
ninja: build stopped: subcommand failed.
Source file was:
#include <omp.h>
int main(void) {
omp_get_max_threads();
return 0;
}
I have the 32bit library available:
$ find /usr/lib/gcc -name libgomp.so
/usr/lib/gcc/x86_64-linux-gnu/11/libgomp.so
/usr/lib/gcc/x86_64-linux-gnu/9/libgomp.so
/usr/lib/gcc/x86_64-linux-gnu/7/libgomp.so
/usr/lib/gcc/x86_64-linux-gnu/7/x32/libgomp.so
/usr/lib/gcc/x86_64-linux-gnu/7/32/libgomp.so
/usr/lib/gcc/x86_64-linux-gnu/10/libgomp.so
/usr/lib/gcc/x86_64-linux-gnu/10/x32/libgomp.so
/usr/lib/gcc/x86_64-linux-gnu/10/32/libgomp.so
Current workaround is to set -DOpenMP_gomp_LIBRARY:FILEPATH=/usr/lib/gcc/x86_64-linux-gnu/7/32/libgomp.so
Which isn't ideal.
Edited by Maxime Roussin-Bélanger