使用CMake构建mysql-connector-cpp项目时遇到编译错误
CMake构建依赖mysql-connector-cpp项目的头文件缺失问题解决
项目背景
本地构建依赖mysql-connector-cpp的CMake项目,最初因版本问题出现配置文件缺失、CPack资源找不到等错误,更新至8.1.0版本(兼容1.1版本)后,将头文件引用改为jdbc/前缀,出现编译时找不到头文件的错误。
项目文件结构
src/ ├─ app/ ├─ common/ ├─ core/ ├─ CMakeLists.txt ThirdParty/ ├─ mysql-connector-cpp/ ├─ CMakeLists.txt CMakeLists.txt
各目录CMake配置代码
根目录CMakeLists.txt
cmake_minimum_required (VERSION 3.5) if(NOT CMAKE_BUILD_TYPE) set(CMAKE_BUILD_TYPE Release) endif(NOT CMAKE_BUILD_TYPE) if(CMAKE_BUILD_TYPE MATCHES Debug) message("Debug build.") elseif(CMAKE_BUILD_TYPE MATCHES Release) message("Release build.") endif() set(application_name "my_project") set(CMAKE_CXX_STANDARD 17) cmake_policy(SET CMP0048 NEW) set(application_version "1.0.2") set(PROJECT_VER ${application_version}) set(WITH_JDBC ON) project (${application_name} LANGUAGES C CXX) add_subdirectory(ThirdParty) add_subdirectory(src)
ThirdParty目录CMakeLists.txt
add_subdirectory(mysql-connector-cpp)
src目录CMakeLists.txt
add_subdirectory(app) add_subdirectory(common) add_subdirectory(core)
src/core目录CMakeLists.txt
set(source src/my_message.cpp ) add_library(core ${source}) target_link_libraries(core PUBLIC common) target_link_libraries(core PUBLIC mysql-connector-cpp) target_include_directories(core PUBLIC inc) target_include_directories(core PRIVATE inc/core)
编译错误信息
In file included from /home/username/workspace/my_project/src/core/src/my_message.cpp:13: /home/username/workspace/my_project/src/core/inc/core/my_message.h:19:10: fatal error: jdbc/driver/mysql_connection.h: No such file or directory #include "jdbc/driver/mysql_connection.h" ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ compilation terminated. gmake[2]: *** [src/core/CMakeFiles/core.dir/build.make:76: src/core/CMakeFiles/core.dir/src/my_message.cpp.o] Error 1 gmake[1]: *** [CMakeFiles/Makefile2:1418: src/core/CMakeFiles/core.dir/all] Error 2 gmake: *** [Makefile:136: all] Error 2
解决方法
原因分析
尽管已经链接了mysql-connector-cpp库,但CMake未自动将连接器的头文件目录添加到core库的编译包含路径中,或者连接器的CMake配置未正确导出头文件路径。
具体修复方案
方案1:直接添加头文件路径到core库
修改src/core/CMakeLists.txt,在target_include_directories部分添加mysql-connector-cpp的头文件目录:
target_include_directories(core PUBLIC inc ${CMAKE_CURRENT_SOURCE_DIR}/../../ThirdParty/mysql-connector-cpp/include PRIVATE inc/core )
方案2:使用正确的连接器CMake目标
mysql-connector-cpp 8.1.0版本的CMake目标名称可能是mysqlcppconn8,替换target_link_libraries中的目标:
target_link_libraries(core PUBLIC common mysqlcppconn8)
该目标会自动关联对应的头文件路径,无需手动添加。
方案3:确保WITH_JDBC选项传递生效
在ThirdParty/CMakeLists.txt中强制设置WITH_JDBC选项,确保连接器构建时启用JDBC模块:
set(WITH_JDBC ON CACHE BOOL "Build JDBC driver" FORCE) add_subdirectory(mysql-connector-cpp)
此操作会保证JDBC相关头文件被正确编译和导出。
内容的提问来源于stack exchange,提问作者cinargursoy
相关产品推荐
相关产品推荐

