我正在使用CMake开发一个用于楼宇自动化的库。在使用“英特尔C编译器”时,我遇到了一个问题。事实上,编译是成功的。
但是,当我在另一个项目中调用该库时,其中未设置Intel环境变量,编译失败,因为找不到某些Intel C内部库(例如libsycl
或libsvml
)。似乎Intel内部库目录不会自动添加到运行时库搜索路径。为了解决此问题,我不得不添加到CMakeList.txt
set_target_properties(myLib PROPERTIES LINK_FLAGS "-Wl,-rpath=${SYCL_LIBRARY_DIR}:${SYCL_LIBRARY_DIR}/../compiler/lib/intel64_lin")
我不认为这是解决问题的最佳方法,因为如果库开始使用不在这些目录中的英特尔库,并且它是平台相关的,那么就应该修改它。如何解决这个问题?
1条答案
按热度按时间vmdwslir1#
这个问题有多个问题,我读的方式:
1.如何确保我的CMake库项目将所有依赖项公开给父项目?
1.如何在CMake应用程序项目中正确包含外部库?
对于1.,CMake库项目公开了多个级别的共享,其中两个最常见:
PRIVATE
PUBLIC
PRIVATE
(通常默认)意味着配置是特定于库的,并且库上的任何依赖者都不能访问它,例如私有/仅库包含路径。您可以使用PUBLIC来公开依赖者需要知道的任何路径:当另一个项目链接到这个库时,它的包含路径中也会有
"${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_package
或find_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