我试图使接口库脱离单独的包含目录和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可以构建。我该怎么做才能摆脱上面的一行代码,仍然能够成功构建?
答案 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)
我可以构建二进制文件并且它可以正常运行