如何通过CMake在C++项目中使用仅头文件库websocketpp并解决编译错误
编译WebSocketPP仅头文件库时头文件找不到的解决方法
问题详情
在/home/user/Desktop/tutorial目录下,已放置从GitHub复制的websocketpp文件夹,项目包含main.cpp和CMakeLists.txt,编译时提示找不到websocketpp/config/core_client.hpp文件。
项目文件内容
main.cpp
#include <iostream> #include "websocketpp/config/asio_client.hpp" int main() { std::cout << "Hello\n"; }
CMakeLists.txt
cmake_minimum_required(VERSION 3.0.0) project(tutorial VERSION 0.1.0 LANGUAGES C CXX) include(CTest) enable_testing() include_directories(websocketpp) add_executable(tutorial main.cpp)
编译错误输出
[main] Building folder: Tutorial all [build] Starting build [proc] Executing command: /usr/bin/cmake --build /home/user/Desktop/tutorial/build --config Debug --target all -j 6 -- [build] [ 50%] Building CXX object CMakeFiles/tutorial.dir/main.cpp.o [build] In file included from /home/user/Desktop/tutorial/main.cpp:2: [build] /home/user/Desktop/tutorial/websocketpp/config/asio_client.hpp:31:10: fatal error: websocketpp/config/core_client.hpp: No such file or directory [build] 31 | #include <websocketpp/config/core_client.hpp> [build] | ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ [build] compilation terminated. [build] gmake[2]: *** [CMakeFiles/tutorial.dir/build.make:76: CMakeFiles/tutorial.dir/main.cpp.o] Error 1 [build] gmake[1]: *** [CMakeFiles/Makefile2:839: CMakeFiles/tutorial.dir/all] Error 2 [build] gmake: *** [Makefile:121: all] Error 2 [proc] The command: /usr/bin/cmake --build /home/user/Desktop/tutorial/build --config Debug --target all -j 6 -- exited with code: 2 [driver] Build completed: 00:00:00.179 [build] Build finished with exit code 2
解决步骤
错误根源是include_directories(websocketpp)的路径设置错误:WebSocketPP内部头文件引用是基于websocketpp目录作为根节点的(比如<websocketpp/config/core_client.hpp>),但当前设置让编译器在websocketpp目录下查找,导致路径变为websocketpp/websocketpp/config/core_client.hpp,自然找不到文件。
修改CMakeLists.txt的包含路径设置:
方法1:使用当前源目录作为包含路径
替换原有include_directories(websocketpp)为:
include_directories(${CMAKE_CURRENT_SOURCE_DIR})
方法2:使用现代CMake的目标级包含路径(推荐)
删除include_directories(websocketpp),在add_executable后添加:
target_include_directories(tutorial PRIVATE ${CMAKE_CURRENT_SOURCE_DIR})
两种方法都能让编译器正确识别websocketpp作为头文件的根目录,解决编译错误。
内容的提问来源于stack exchange,提问作者user3376601
相关产品推荐
相关产品推荐

