如何通过cmake中的接口库正确传播使用需求?

时间:2018-10-19 20:44:32

标签: 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可以构建。我该怎么做才能摆脱上面的一行代码,仍然能够成功构建?

1 个答案:

答案 0 :(得分:0)

因此,正如杰森·哈斯兰(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)

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