链接到Intel静态库会引入循环依赖关系。当我导入库时,
set(LIBRARIES mkl_intel_lp64 mkl_sequential mkl_core)
foreach(_lib ${LIBRARIES})
add_library(${_lib} UNKNOWN IMPORTED)
set_target_properties(${_lib} PROPERTIES IMPORTED_LOCATION
/opt/intel/mkl/lib/intel64/lib${_lib}.a)
endforeach()链接到我的可执行文件,
target_link_libraries(main PRIVATE ${LIBRARIES})我得到了大量关于线性代数调用的未定义的引用。例如,
ztrevc3_gen.f:(.text+0x1af7): undefined reference to `mkl_blas_zdscal'解决这一问题的一种方法是使用适当的链接器标志:
target_link_libraries(main PRIVATE -Wl,--start-group ${LIBRARIES} -Wl,--end-group)另一种选择是这样做:
target_link_libraries(main PRIVATE ${LIBRARIES} ${LIBRARIES} ${LIBRARIES})然而,在我寻找更优雅的解决方案时,我遇到了LINK_INTERFACE_MULTIPLICITY属性。如果将此属性与导入的库位置一起设置,
set(LIBRARIES mkl_intel_lp64 mkl_sequential mkl_core)
foreach(_lib ${LIBRARIES})
add_library(${_lib} UNKNOWN IMPORTED)
set_target_properties(${_lib} PROPERTIES IMPORTED_LOCATION
/opt/intel/mkl/lib/intel64/lib${_lib}.a
LINK_INTERFACE_MULTIPLICITY 3)
endforeach()我得到了和以前一样的未定义的引用,所以这显然是行不通的。使用LINK_INTERFACE_MULTIPLICITY的正确方法是什么,是否有一种更优雅的方法来绕过循环依赖关系?
编辑
下面是一个失败的最小示例,这次是使用正确的IMPORTED_LINK_INTERFACE_MULTIPLICITY变量。
# CMakeLists.txt
cmake_minimum_required(VERSION 3.10)
project(test Fortran)
add_executable(main main.f90)
set(LIBRARIES mkl_intel_lp64 mkl_sequential mkl_core)
foreach(_lib ${LIBRARIES})
add_library(${_lib} UNKNOWN IMPORTED)
set_target_properties(${_lib} PROPERTIES IMPORTED_LOCATION
/opt/intel/mkl/lib/intel64/lib${_lib}.a
IMPORTED_LINK_INTERFACE_MULTIPLICITY 3)
endforeach()
list(APPEND LIBRARIES dl pthread)
target_link_libraries(main ${LIBRARIES})
#target_link_libraries(main ${LIBRARIES} ${LIBRARIES} ${LIBRARIES})
# main.f90
call zpotrf
end program如果取消对最后一行的注释,则构建成功。不幸的是,MKL在不免费(在某些情况下除外),但希望有人可以测试这一点。我应该指出,它在一些线性代数调用中失败,而不是像dgemm这样的其他调用。
https://stackoverflow.com/questions/50166553
复制相似问题