如何使用CMake将“英特尔C++”库路径添加到运行时库路径?

inb24sb2  于 2023-04-21  发布在  其他
关注(0)|答案(1)|浏览(135)

我正在使用CMake开发一个用于楼宇自动化的库。在使用“英特尔C编译器”时,我遇到了一个问题。事实上,编译是成功的。
但是,当我在另一个项目中调用该库时,其中未设置Intel环境变量,编译失败,因为找不到某些Intel C
内部库(例如libsycllibsvml)。似乎Intel内部库目录不会自动添加到运行时库搜索路径。为了解决此问题,我不得不添加到CMakeList.txt
set_target_properties(myLib PROPERTIES LINK_FLAGS "-Wl,-rpath=${SYCL_LIBRARY_DIR}:${SYCL_LIBRARY_DIR}/../compiler/lib/intel64_lin")
我不认为这是解决问题的最佳方法,因为如果库开始使用不在这些目录中的英特尔库,并且它是平台相关的,那么就应该修改它。如何解决这个问题?

vmdwslir

vmdwslir1#

这个问题有多个问题,我读的方式:
1.如何确保我的CMake库项目将所有依赖项公开给父项目?
1.如何在CMake应用程序项目中正确包含外部库?
对于1.,CMake库项目公开了多个级别的共享,其中两个最常见:

  • PRIVATE
  • PUBLIC

PRIVATE(通常默认)意味着配置是特定于库的,并且库上的任何依赖者都不能访问它,例如私有/仅库包含路径。您可以使用PUBLIC来公开依赖者需要知道的任何路径:

target_include_directories(myLib 
                       PUBLIC
                       "${CMAKE_CURRENT_SOURCE_DIR}/include/"
)
target_include_directories(myLib 
                       PRIVATE
                       "${CMAKE_CURRENT_SOURCE_DIR}/library-src/"
)

当另一个项目链接到这个库时,它的包含路径中也会有"${CMAKE_CURRENT_SOURCE_DIR}/include/",但不会有"${CMAKE_CURRENT_SOURCE_DIR}/library-src/"
参见https://cmake.org/cmake/help/latest/guide/importing-exporting/index.html
对于链接选项,以及构建/公开接口的其他重要方面(如头),也可以这样做。
对于问题2.,了解约定很重要。通常查找和链接库是用find_library(或任何其他用于导入外部配置的函数)完成的。
你的库包可以要求父项目公开变量(或选项),如$INTEL_LIBRARIES_PATH,你可以在你的项目中共享这些变量。配置将在最上面的源目录中运行cmake时发生(即指向库,路径等,可配置变量也可以在CMake中使用,请参阅option)。
如果“英特尔编译器”在find_packagefind_library中包含一个库、软件包或其他CMake配置文件,则在此之后,只要编译它的计算机也有这些配置、编译器和库,它就应该始终可用于库。
依赖项指南应该为您提供一个良好的开端,以了解本文未涵盖的任何内容:https://cmake.org/cmake/help/latest/guide/using-dependencies/index.html#guide:Using%20Dependencies%20Guide
英特尔专用软件包应随附于:
find_package(IntelDPCPP REQUIRED)
https://www.intel.com/content/www/us/en/docs/dpcpp-cpp-compiler/developer-guide-reference/2023-0/use-cmake-with-the-compiler.html

相关问题