【问题标题】:Linking libraries translating from command line to Make将从命令行翻译的库链接到 Make
【发布时间】:2020-03-09 14:50:06
【问题描述】:

我正在尝试让英特尔数学内核库 (mkl) 运行。有一个工具 (https://software.intel.com/en-us/articles/intel-mkl-link-line-advisor) 可以打印必要的、依赖于环境的 cmd 命令,以将其用于 C++ 脚本。对我来说,它说:

使用此链接行: ${MKLROOT}/lib/libmkl_intel_lp64.a ${MKLROOT}/lib/libmkl_intel_thread.a ${MKLROOT}/lib/libmkl_core.a -liomp5 -lpthread -lm -ldl

编译器选项: -m64 -I${MKLROOT}/包括

我的目标是在 CMake 脚本中编写它。我哪里错了/我必须写什么才能使它工作?

cmake_minimum_required(VERSION 3.15)
project(PSD_Projections)

set(CMAKE_CXX_STANDARD 14)
set(MKL_DIR /opt/intel/mkl)

# Part for the linker line
# This seems to be somewhat okay
# However I can't figure out what to do about the other linker line arguments
find_library(LIB1 mkl_intel_lp64 ${MKL_DIR}/lib)
find_library(LIB2 mkl_intel_thread ${MKL_DIR}/lib)
find_library(LIB3 mkl_core ${MKL_DIR}/lib)
link_libraries(${LIB1} ${LIB2} ${LIB3})

# Part for the compiler options.
# ${MKL_DIR}/include is found and exists
# I don't know what to do about the -m64 
include_directories(${MKL_DIR}/include)

add_executable(PSD_Projections main.cpp)

【问题讨论】:

  • 您是否在 32 位主机上交叉编译您的应用程序?如果您已经在 64 位主机上,则不需要 -m64 标志。
  • 至于实际的库文件以及如何链接,使用target_link_libraries命令。

标签: c++ libraries intel-mkl cmake-language


【解决方案1】:

顺序 ILP64 版本的示例:

target_include_directories(PSD_Projections PUBLIC "${MKL_DIR}/include")
target_compile_definitions(PSD_Projections PUBLIC MKL_ILP64)
target_link_directories(PSD_Projections PUBLIC "${MKL_DIR}/lib/intel64")
target_link_libraries(PSD_Projections PUBLIC mkl_intel_ilp64 mkl_sequential mkl_core m dl)
target_link_options(PSD_Projections PUBLIC "-Wl,--no-as-needed")

它可以很容易地根据您的需要进行调整。

如何设置 C++ 标准版本和编译器选项的示例:

target_compile_features(PSD_Projections PUBLIC cxx_std_14)
target_compile_options(PSD_Projections PUBLIC -Wall -Wpedantic -Wextra -m64 -march=native)

【讨论】:

  • 我同意,您应该使用target_* cmake 函数来本地化您的操作范围。您示例中的 CMake 代码非常老式。例如,include_directorieslink_libraries 函数现在在 CMake 文档本身中被列为已弃用。
  • "-Wl,--no-as-needed" 可以放入target_link_options
  • @GuillaumeRacicot,从最佳实践的角度来看,可以放的应该放吗?
  • @Evg 应该。就像调用target_compile_definitions 比在target_compile_options 中传递-DXYZ 更好
  • @Evg 搜索了一下,有一个目标属性LINK_WHAT_YOU_USE 会自动添加所需的标志,例如--no-as-needed
猜你喜欢
  • 1970-01-01
  • 2011-09-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-04-09
  • 2020-09-14
  • 1970-01-01
相关资源
最近更新 更多