使用Vcpkg集成libXi时CMake找不到配置文件的问题求助
解决CMake找不到libxi的问题
1. 修正CMakeLists.txt变量错误
你的target_link_libraries中使用了未定义的${TARGET_NAME},需替换为${PROJECT_NAME},否则编译时会找不到目标可执行文件。
2. 改用pkg-config查找libXi库
libXi作为X11核心库,vcpkg安装的libxi端口未提供CMake配置文件(即错误提示中的libxiConfig.cmake),需通过pkg-config来定位库文件和头文件路径。修改后的CMakeLists.txt如下:
# project_root/CMakeLists.txt cmake_minimum_required(VERSION 3.26 FATAL_ERROR) set(CMAKE_C_STANDARD 17) set(CMAKE_C_STANDARD_REQUIRED True) message("The c version is ${CMAKE_C_STANDARD}, using the ${CMAKE_C_COMPILER} compiler") project(prj C) # 启用pkg-config模块 find_package(PkgConfig REQUIRED) # 通过pkg-config查找libXi pkg_check_modules(LIBXI REQUIRED IMPORTED_TARGET xi) add_executable(${PROJECT_NAME} main.c) target_include_directories(${PROJECT_NAME} PUBLIC "${PROJECT_BINARY_DIR}" "${CMAKE_CURRENT_SOURCE_DIR}/include/" ) # 链接pkg-config提供的目标 target_link_libraries(${PROJECT_NAME} PRIVATE PkgConfig::LIBXI)
3. 确保vcpkg与CMake正确集成
运行CMake时需指定vcpkg工具链文件,命令示例:
cmake -S . -B build -DCMAKE_TOOLCHAIN_FILE=/home/username/vcpkg/scripts/buildsystems/vcpkg.cmake
若使用VS Code,可在.vscode/settings.json中配置预设:
{ "cmake.configureSettings": { "CMAKE_TOOLCHAIN_FILE": "/home/username/vcpkg/scripts/buildsystems/vcpkg.cmake" } }
4. 备选方案:直接使用系统库
若无需vcpkg管理libXi,可直接安装系统开发包:
sudo apt-get install libxi-dev
对应的简化CMakeLists.txt:
cmake_minimum_required(VERSION 3.26 FATAL_ERROR) set(CMAKE_C_STANDARD 17) set(CMAKE_C_STANDARD_REQUIRED True) message("The c version is ${CMAKE_C_STANDARD}, using the ${CMAKE_C_COMPILER} compiler") project(prj C) add_executable(${PROJECT_NAME} main.c) target_include_directories(${PROJECT_NAME} PUBLIC "${PROJECT_BINARY_DIR}" "${CMAKE_CURRENT_SOURCE_DIR}/include/" ) # 直接链接系统libXi库 target_link_libraries(${PROJECT_NAME} PRIVATE Xi)
全局鼠标移动测试代码
以下代码可验证全局鼠标移动功能(需X11权限):
#include <X11/Xlib.h> #include <stdio.h> int main() { Display *dpy = XOpenDisplay(NULL); if (!dpy) { fprintf(stderr, "Failed to open display\n"); return 1; } int screen = DefaultScreen(dpy); Window root = RootWindow(dpy, screen); // 移动鼠标到屏幕中心 int x = DisplayWidth(dpy, screen) / 2; int y = DisplayHeight(dpy, screen) / 2; XWarpPointer(dpy, None, root, 0, 0, 0, 0, x, y); XFlush(dpy); XCloseDisplay(dpy); return 0; }
内容的提问来源于stack exchange,提问作者Dhairya Gupta
相关产品推荐
相关产品推荐

