Link groups are not correctly handled by CMake
So trying to build armadillo with static IntelMKL.
Problem:
A lot of something like zhbrdb_gen.f:(.text+0xce): undefined reference to 'mkl_lapack_zhbrdbn'
Compile/Link command generating the error:
FAILED: tests1/smoke_test
: && /usr/bin/c++ -fPIC -O2 -g -rdynamic tests1/CMakeFiles/smoke_test.dir/smoke_test.cpp.o -o tests1/smoke_test -Wl,-rpath,/mnt/e/vcpkg_folders/vcpkg_clean_1/installed/x64-linux/lib/intel64 libarmadillo.a -Wl,--start-group -Wl,--end-group /mnt/e/vcpkg_folders/vcpkg_clean_1/installed/x64-linux/lib/intel64/libmkl_intel_lp64.a /mnt/e/vcpkg_folders/vcpkg_clean_1/installed/x64-linux/lib/intel64/libmkl_intel_thread.a /mnt/e/vcpkg_folders/vcpkg_clean_1/installed/x64-linux/lib/intel64/libmkl_core.a /mnt/e/vcpkg_folders/vcpkg_clean_1/installed/x64-linux/lib/intel64/libiomp5.so -lm -ldl /mnt/e/vcpkg_folders/vcpkg_clean_1/installed/x64-linux/lib/intel64/libmkl_intel_lp64.a /mnt/e/vcpkg_folders/vcpkg_clean_1/installed/x64-linux/lib/intel64/libmkl_intel_thread.a /mnt/e/vcpkg_folders/vcpkg_clean_1/installed/x64-linux/lib/intel64/libmkl_core.a /mnt/e/vcpkg_folders/vcpkg_clean_1/installed/x64-linux/lib/intel64/libiomp5.so -lm -ldl && :
to be more precise link flags have been reorder to:
-Wl,--start-group -Wl,--end-group /mnt/e/vcpkg_folders/vcpkg_clean_1/installed/x64-linux/lib/intel64/libmkl_intel_lp64.a /mnt/e/vcpkg_folders/vcpkg_clean_1/installed/x64-linux/lib/intel64/libmkl_intel_thread.a /mnt/e/vcpkg_folders/vcpkg_clean_1/installed/x64-linux/lib/intel64/libmkl_core.a
From:
tests1/CMakeLists.txt(2): target_link_libraries(smoke_test PRIVATE armadillo )
CMakeLists.txt(610): target_link_libraries(armadillo -Wl,--start-group;/mnt/e/vcpkg_folders/vcpkg_clean_1/installed/x64-linux/lib/intel64/libmkl_intel_lp64.a;/mnt/e/vcpkg_folders/vcpkg_clean_1/installed/x64-linux/lib/intel64/libmkl_intel_thread.a;/mnt/e/vcpkg_folders/vcpkg_clean_1/installed/x64-linux/lib/intel64/libmkl_core.a;-Wl,--end-group;/mnt/e/vcpkg_folders/vcpkg_clean_1/installed/x64-linux/lib/intel64/libiomp5.so;-lm;-ldl;-Wl,--start-group;/mnt/e/vcpkg_folders/vcpkg_clean_1/installed/x64-linux/lib/intel64/libmkl_intel_lp64.a;/mnt/e/vcpkg_folders/vcpkg_clean_1/installed/x64-linux/lib/intel64/libmkl_intel_thread.a;/mnt/e/vcpkg_folders/vcpkg_clean_1/installed/x64-linux/lib/intel64/libmkl_core.a;-Wl,--end-group;/mnt/e/vcpkg_folders/vcpkg_clean_1/installed/x64-linux/lib/intel64/libiomp5.so;-lm;-ldl;-lm;-ldl )
Which in my personal opinion looks like a bug in CMake (3.25.1). CMake should scan for -Wl,--start-group|--end-group
and treat everything inbetween as a single object instead of trying to deduplicate everything inside.