0

Cmake on my project uses external projects. I want to recompile everything, but I want to pass -llikwid flag too all linking commands, including all external project. I exported LDFLAGS="-llikwid", but it's not working. The LDFLAGS gets added too early, and linking fails. If I add -llikwid manually at the end of the linking command, then linking succeeds.

Here is how the linking line looks like when linking fails:

$ /usr/bin/c++ -DLIKWID_PERFMON -O2 -g -DNDEBUG -llikwid -Wl,-z,noexecstack -Wl,-z,relro,-z,now -pie -Wl,--exclude-libs,libz.a -Wl,--exclude-libs,libzmq.a -Wl,--exclude-libs,libvtkFiltersGeneral-9.1.a -Wl,--exclude-libs,libvtkFiltersCore-9.1.a -Wl,--exclude-libs,libvtkCommonExecutionModel-9.1.a -Wl,--exclude-libs,libvtkCommonDataModel-9.1.a -Wl,--exclude-libs,libvtkCommonTransforms-9.1.a -Wl,--exclude-libs,libvtkCommonMath-9.1.a -Wl,--exclude-libs,libvtkCommonMisc-9.1.a -Wl,--exclude-libs,libvtkCommonSystem-9.1.a -Wl,--exclude-libs,libvtkCommonCore-9.1.a -Wl,--exclude-libs,libvtkkissfft-9.1.a -Wl,--exclude-libs,libvtkpugixml-9.1.a -Wl,--exclude-libs,libvtksys-9.1.a -Wl,--exclude-libs,libmkl_merged.a -Wl,--exclude-libs,libtbb_static.a -Wl,--exclude-libs,libippiw.a -Wl,--exclude-libs,libippicv.a -Wl,--exclude-libs,libembree3.a -Wl,--exclude-libs,libembree_avx.a -Wl,--exclude-libs,libembree_avx2.a -Wl,--exclude-libs,libsimd.a -Wl,--exclude-libs,liblexers.a -Wl,--exclude-libs,libsys.a -Wl,--exclude-libs,libmath.a -Wl,--exclude-libs,libtasking.a CMakeFiles/ManuallyCropGeometry.dir/ManuallyCropGeometry.cpp.o -o ../../bin/ManuallyCropGeometry  ../../lib/RelWithDebInfo/libOpen3D.a -lstdc++fs ../../assimp/lib/libassimp.a ../../turbojpeg/lib/libturbojpeg.a ../../jsoncpp/lib/libjsoncpp.a ../../lib/RelWithDebInfo/libOpen3D_3rdparty_liblzf.a ../../curl/src/ext_curl/lib/libcurl.a ../../boringssl/src/ext_boringssl/lib/libssl.a ../../boringssl/src/ext_boringssl/lib/libcrypto.a ../../libpng/lib/libpng16.a ../../zlib/lib/libz.a ../../lib/RelWithDebInfo/libOpen3D_3rdparty_rply.a ../../lib/RelWithDebInfo/libOpen3D_3rdparty_tinyfiledialogs.a ../../lib/RelWithDebInfo/libOpen3D_3rdparty_qhullcpp.a ../../lib/RelWithDebInfo/libOpen3D_3rdparty_qhull_r.a ../../zeromq/lib/libzmq.a ../../vtk/src/ext_vtk/lib/libvtkFiltersGeneral-9.1.a ../../vtk/src/ext_vtk/lib/libvtkFiltersCore-9.1.a ../../vtk/src/ext_vtk/lib/libvtkCommonExecutionModel-9.1.a ../../vtk/src/ext_vtk/lib/libvtkCommonDataModel-9.1.a ../../vtk/src/ext_vtk/lib/libvtkCommonTransforms-9.1.a ../../vtk/src/ext_vtk/lib/libvtkCommonMath-9.1.a ../../vtk/src/ext_vtk/lib/libvtkCommonMisc-9.1.a ../../vtk/src/ext_vtk/lib/libvtkCommonSystem-9.1.a ../../vtk/src/ext_vtk/lib/libvtkCommonCore-9.1.a ../../vtk/src/ext_vtk/lib/libvtkkissfft-9.1.a ../../vtk/src/ext_vtk/lib/libvtkpugixml-9.1.a ../../vtk/src/ext_vtk/lib/libvtksys-9.1.a ../../mkl_install/lib/libtbbmalloc_static.a ../../mkl_install/lib/libmkl_merged.a ../../mkl_install/lib/libtbb_static.a ../../embree/lib/libembree3.a ../../embree/lib/libembree_avx.a ../../embree/lib/libembree_avx2.a ../../embree/lib/libsimd.a ../../embree/lib/liblexers.a ../../embree/lib/libsys.a ../../embree/lib/libmath.a ../../embree/lib/libtasking.a /usr/lib/gcc/x86_64-linux-gnu/11/libgomp.so /usr/lib/x86_64-linux-gnu/libpthread.a ../../ippicv/lib/libippiw.a ../../ippicv/lib/libippicv.a ../../lib/RelWithDebInfo/libOpen3D_3rdparty_glew.a -lstdc++fs ../../lib/RelWithDebInfo/libglfw3.a /usr/lib/x86_64-linux-gnu/librt.a -lm -ldl /usr/lib/x86_64-linux-gnu/libX11.so ../../fmt/lib/libfmt.a /usr/lib/x86_64-linux-gnu/libGL.so 
/usr/bin/ld: ../../lib/RelWithDebInfo/libOpen3D.a(KDTreeFlann.cpp.o): in function `bool nanoflann::KDTreeSingleIndexAdaptor<nanoflann::L2_Adaptor<double, nanoflann::KDTreeEigenMatrixAdaptor<Eigen::Map<Eigen::Matrix<double, -1, -1, 0, -1, -1> const, 0, Eigen::Stride<0, 0> >, -1, nanoflann::metric_L2, false>, double>, nanoflann::KDTreeEigenMatrixAdaptor<Eigen::Map<Eigen::Matrix<double, -1, -1, 0, -1, -1> const, 0, Eigen::Stride<0, 0> >, -1, nanoflann::metric_L2, false>, -1, long>::findNeighbors<nanoflann::KNNResultSet<double, long, unsigned long> >(nanoflann::KNNResultSet<double, long, unsigned long>&, double const*, nanoflann::SearchParams const&) const':
/home/ivica/Projects/Open3D/build/nanoflann/src/ext_nanoflann/include/nanoflann.hpp:1239: undefined reference to `likwid_markerStartRegion'
/usr/bin/ld: /home/ivica/Projects/Open3D/build/nanoflann/src/ext_nanoflann/include/nanoflann.hpp:1243: undefined reference to `likwid_markerStopRegion'
/usr/bin/ld: ../../lib/RelWithDebInfo/libOpen3D.a(KDTreeFlann.cpp.o): in function `bool nanoflann::KDTreeSingleIndexAdaptor<nanoflann::L2_Adaptor<double, nanoflann::KDTreeEigenMatrixAdaptor<Eigen::Map<Eigen::Matrix<double, -1, -1, 0, -1, -1> const, 0, Eigen::Stride<0, 0> >, -1, nanoflann::metric_L2, false>, double>, nanoflann::KDTreeEigenMatrixAdaptor<Eigen::Map<Eigen::Matrix<double, -1, -1, 0, -1, -1> const, 0, Eigen::Stride<0, 0> >, -1, nanoflann::metric_L2, false>, -1, long>::findNeighbors<nanoflann::RadiusResultSet<double, long> >(nanoflann::RadiusResultSet<double, long>&, double const*, nanoflann::SearchParams const&) const':
/home/ivica/Projects/Open3D/build/nanoflann/src/ext_nanoflann/include/nanoflann.hpp:1239: undefined reference to `likwid_markerStartRegion'
/usr/bin/ld: /home/ivica/Projects/Open3D/build/nanoflann/src/ext_nanoflann/include/nanoflann.hpp:1243: undefined reference to `likwid_markerStopRegion'
/usr/bin/ld: /home/ivica/Projects/Open3D/build/nanoflann/src/ext_nanoflann/include/nanoflann.hpp:1239: undefined reference to `likwid_markerStartRegion'
/usr/bin/ld: /home/ivica/Projects/Open3D/build/nanoflann/src/ext_nanoflann/include/nanoflann.hpp:1243: undefined reference to `likwid_markerStopRegion'

Here is it when linking succeds (notice the position of -llikwid).

$ /usr/bin/c++ -DLIKWID_PERFMON -O2 -g -DNDEBUG -Wl,-z,noexecstack -Wl,-z,relro,-z,now -pie -Wl,--exclude-libs,libz.a -Wl,--exclude-libs,libzmq.a -Wl,--exclude-libs,libvtkFiltersGeneral-9.1.a -Wl,--exclude-libs,libvtkFiltersCore-9.1.a -Wl,--exclude-libs,libvtkCommonExecutionModel-9.1.a -Wl,--exclude-libs,libvtkCommonDataModel-9.1.a -Wl,--exclude-libs,libvtkCommonTransforms-9.1.a -Wl,--exclude-libs,libvtkCommonMath-9.1.a -Wl,--exclude-libs,libvtkCommonMisc-9.1.a -Wl,--exclude-libs,libvtkCommonSystem-9.1.a -Wl,--exclude-libs,libvtkCommonCore-9.1.a -Wl,--exclude-libs,libvtkkissfft-9.1.a -Wl,--exclude-libs,libvtkpugixml-9.1.a -Wl,--exclude-libs,libvtksys-9.1.a -Wl,--exclude-libs,libmkl_merged.a -Wl,--exclude-libs,libtbb_static.a -Wl,--exclude-libs,libippiw.a -Wl,--exclude-libs,libippicv.a -Wl,--exclude-libs,libembree3.a -Wl,--exclude-libs,libembree_avx.a -Wl,--exclude-libs,libembree_avx2.a -Wl,--exclude-libs,libsimd.a -Wl,--exclude-libs,liblexers.a -Wl,--exclude-libs,libsys.a -Wl,--exclude-libs,libmath.a -Wl,--exclude-libs,libtasking.a CMakeFiles/ManuallyCropGeometry.dir/ManuallyCropGeometry.cpp.o -o ../../bin/ManuallyCropGeometry  ../../lib/RelWithDebInfo/libOpen3D.a -lstdc++fs ../../assimp/lib/libassimp.a ../../turbojpeg/lib/libturbojpeg.a ../../jsoncpp/lib/libjsoncpp.a ../../lib/RelWithDebInfo/libOpen3D_3rdparty_liblzf.a ../../curl/src/ext_curl/lib/libcurl.a ../../boringssl/src/ext_boringssl/lib/libssl.a ../../boringssl/src/ext_boringssl/lib/libcrypto.a ../../libpng/lib/libpng16.a ../../zlib/lib/libz.a ../../lib/RelWithDebInfo/libOpen3D_3rdparty_rply.a ../../lib/RelWithDebInfo/libOpen3D_3rdparty_tinyfiledialogs.a ../../lib/RelWithDebInfo/libOpen3D_3rdparty_qhullcpp.a ../../lib/RelWithDebInfo/libOpen3D_3rdparty_qhull_r.a ../../zeromq/lib/libzmq.a ../../vtk/src/ext_vtk/lib/libvtkFiltersGeneral-9.1.a ../../vtk/src/ext_vtk/lib/libvtkFiltersCore-9.1.a ../../vtk/src/ext_vtk/lib/libvtkCommonExecutionModel-9.1.a ../../vtk/src/ext_vtk/lib/libvtkCommonDataModel-9.1.a ../../vtk/src/ext_vtk/lib/libvtkCommonTransforms-9.1.a ../../vtk/src/ext_vtk/lib/libvtkCommonMath-9.1.a ../../vtk/src/ext_vtk/lib/libvtkCommonMisc-9.1.a ../../vtk/src/ext_vtk/lib/libvtkCommonSystem-9.1.a ../../vtk/src/ext_vtk/lib/libvtkCommonCore-9.1.a ../../vtk/src/ext_vtk/lib/libvtkkissfft-9.1.a ../../vtk/src/ext_vtk/lib/libvtkpugixml-9.1.a ../../vtk/src/ext_vtk/lib/libvtksys-9.1.a ../../mkl_install/lib/libtbbmalloc_static.a ../../mkl_install/lib/libmkl_merged.a ../../mkl_install/lib/libtbb_static.a ../../embree/lib/libembree3.a ../../embree/lib/libembree_avx.a ../../embree/lib/libembree_avx2.a ../../embree/lib/libsimd.a ../../embree/lib/liblexers.a ../../embree/lib/libsys.a ../../embree/lib/libmath.a ../../embree/lib/libtasking.a /usr/lib/gcc/x86_64-linux-gnu/11/libgomp.so /usr/lib/x86_64-linux-gnu/libpthread.a ../../ippicv/lib/libippiw.a ../../ippicv/lib/libippicv.a ../../lib/RelWithDebInfo/libOpen3D_3rdparty_glew.a -lstdc++fs ../../lib/RelWithDebInfo/libglfw3.a /usr/lib/x86_64-linux-gnu/librt.a -lm -ldl /usr/lib/x86_64-linux-gnu/libX11.so ../../fmt/lib/libfmt.a /usr/lib/x86_64-linux-gnu/libGL.so -llikwid

How can I fix this?

Bogi
  • 2,274
  • 5
  • 26
  • 34
  • 1
    Yes, CMake adds generic linker flags (e.f. from LDFLAGS) **before** the libraries (added with `target_link_libraries`). It is not common to add libraries via linker flags. If your external project uses the library, the project itself should request that linkage. Missing the needed linkage is the deficiency of the project. If you want to **fix** the external project, consider using `PATCH_COMMAND` in `ExternalProject_Add`. See also [that question](https://stackoverflow.com/questions/25243336/specifying-libraries-for-cmake-to-link-to-from-command-line) about similar problem. – Tsyvarev Feb 18 '23 at 21:05

0 Answers0