cmake - 如何通过 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。我该怎么做才能摆脱上面的一行代码并且仍然能够成功构建?
解决方案
因此,正如 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)
我可以构建二进制文件并正常运行
推荐阅读
- ffmpeg - ffmpeg mingw 编译 8192 字符限制 - 重新访问
- android - Android AR Sceneform 设备方向更改
- angular - 如何动态滚动
- python - Keras 是否忽略掩码值的标签?
- javascript - 播放然后在网页上一个接一个地暂停多个可见视频 - Javascript
- javascript - 如何用 jest 和 mock 测试 react native code for firebase
- r - 如何在 R 中生成随机图?
- android - Firebase 电话号码验证并不总是发送短信
- sql - 使用日期模式 mm/dd/yyyy HH:mm 将 Varbinary 转换为 XML SQL Server
- python - 由于 Cookie 处理,Python 请求 AJAX 响应与浏览器不同