CMake中find_package可定位GLFW但TARGET glfw/glfw3判定为假的问题排查
问题原因与解决方案
核心原因
两个现象的逻辑完全独立,和你当前的FindGLFW.cmake实现直接相关:
if(TARGET xxx)仅判断当前CMake构建系统内是否存在名为xxx的CMake目标。你当前的Find模块仅完成了头文件路径、库文件的查找,将结果存入GLFW_INCLUDE_DIR、GLFW_LIBRARY变量,全程没有通过add_library()创建对应名称的导入目标(IMPORTED Target),因此判断结果必然为假。target_link_libraries(xxx glfw3)能正常构建,是因为CMake对该命令的参数有两种处理逻辑:如果参数是已定义的CMake目标,自动关联目标的预配置链接属性;如果不是已知目标,会直接将字符串透传给底层链接器。这种情况下只要链接器的搜索路径中存在匹配的库文件(如libglfw3.so、glfw3.lib),就能完成链接,整个过程不需要CMake识别glfw3为合法目标。
修复方案
在FindGLFW.cmake中,确认GLFW查找成功后补充导入目标的创建逻辑,示例代码如下:
# 原有代码保留 find_path( GLFW_INCLUDE_DIR NAMES GLFW PATHS include) find_library( GLFW_LIBRARY NAMES glfw glfw3 glfw3dll PATHS lib) include(FindPackageHandleStandardArgs) find_package_handle_standard_args(GLFW REQUIRED_VARS GLFW_LIBRARY GLFW_INCLUDE_DIR) # 新增:创建导入目标 if(GLFW_FOUND AND NOT TARGET glfw) add_library(glfw UNKNOWN IMPORTED) set_target_properties(glfw PROPERTIES IMPORTED_LOCATION "${GLFW_LIBRARY}" INTERFACE_INCLUDE_DIRECTORIES "${GLFW_INCLUDE_DIR}" ) endif()
如果需要目标名为glfw3,只需将上述新增代码中的glfw替换为glfw3即可。添加后,if(TARGET glfw)(或glfw3)会返回真,同时后续target_link_libraries可以直接关联该目标,自动继承头文件路径等配置,无需单独手动设置包含路径。
内容的提问来源于stack exchange,提问作者Tim
相关产品推荐
相关产品推荐

