首页 > 解决方案 > 如何通过 cmake 中的接口库正确传播使用需求?

问题描述

我正在尝试从分离的包含目录和cmake中另一个目录的二进制路径中创建一个接口库。我的代码是:

set(OpenCL_INCLUDE_DIRS ${opencl_prefix}/include/ CACHE PATH "Opencl headers location")
set(OpenCL_LIBRARIES ${opencl_prefix}/lib64/libOpenCL.so.1.1 CACHE FILEPATH "Opencl library location")
add_library(OpenCL INTERFACE)
target_include_directories(OpenCL INTERFACE ${OpenCL_INCLUDE_DIRS})
target_link_libraries(OpenCL INTERFACE ${OpenCL_LIBRARIES})

然后我使用我定义的 OpenCL 库来指定名为“opencl_mult_test”的二进制文件的使用要求:

add_executable(opencl_mult_test [[# some sources here #]])
target_link_libraries(opencl_mult_test PUBLIC OpenCL)

此时,当我检查 opencl_mult_test 的 INTERFACE_LINK_LIBRARIES 时,它正确指向 OpenCL,但 INTERFACE_INCLUDE_DIRECTORIES 和 INCLUDE_DIRECTORIES 都是空属性,因此无法构建。此外,当我使用:

target_include_directories(opencl_mult_test PUBLIC ${OpenCL_INCLUDE_DIRS})

可以构建 opencl_mult_test。我该怎么做才能摆脱上面的一行代码并且仍然能够成功构建?

标签: cmake

解决方案


因此,正如 Jason Haslam 所说,我对代码进行了这些修改,而不是:

set(OpenCL_INCLUDE_DIRS ${opencl_prefix}/include/ CACHE PATH "Opencl headers location")
set(OpenCL_LIBRARIES ${opencl_prefix}/lib64/libOpenCL.so.1.1 CACHE FILEPATH "Opencl library location")
add_library(OpenCL INTERFACE)
target_include_directories(OpenCL INTERFACE ${OpenCL_INCLUDE_DIRS})
target_link_libraries(OpenCL INTERFACE ${OpenCL_LIBRARIES})

我用了:

set(OpenCL_INCLUDE_DIRS ${opencl_prefix}/include/ CACHE PATH "Opencl headers location")
set(OpenCL_LIBRARIES ${opencl_prefix}/lib64/libOpenCL.so.1.1 CACHE FILEPATH "Opencl library location")
add_library(OpenCL UNKNOWN IMPORTED)
set_target_properties(OpenCL PROPERTIES
    IMPORTED_LINK_INTERFACE_LANGUAGES CXX
    IMPORTED_LOCATION ${OpenCL_LIBRARIES}
    INTERFACE_INCLUDE_DIRECTORIES ${OpenCL_INCLUDE_DIRS})

现在只需:

target_link_libraries(opencl_mult_test PUBLIC OpenCL)

我可以构建二进制文件并正常运行


推荐阅读