如何在CMake项目中以Superbuild方式构建mysql-connector-cpp?
解决Superbuild方式构建mysql-connector-cpp的链接错误
以下是针对你遇到的链接错误的具体修复步骤:
1. 修复mysql-connector-cpp的INTERFACE库配置
当前ThirdParty/CMakeLists.txt仅设置了头文件路径,未关联编译生成的静态库,导致mysql相关函数无法找到。修改该文件如下:
include(ExternalProject) set(MYSQL_CONNECTOR_BINARY_DIR ${CMAKE_CURRENT_BINARY_DIR}/mysql-connector-cpp_Build) set(MYSQL_CONNECTOR_INSTALL_DIR ${MYSQL_CONNECTOR_BINARY_DIR}/install) ExternalProject_Add(mysql-connector-cpp_Proj SOURCE_DIR ${CMAKE_CURRENT_SOURCE_DIR}/mysql-connector-cpp BINARY_DIR ${MYSQL_CONNECTOR_BINARY_DIR} USES_TERMINAL_CONFIGURE TRUE USES_TERMINAL_BUILD TRUE CMAKE_ARGS ${opt_args} -DCMAKE_INSTALL_PREFIX=${MYSQL_CONNECTOR_INSTALL_DIR} -DWITH_JDBC=ON -DBUILD_STATIC=ON # 同步主项目的编译配置 -DCMAKE_BUILD_TYPE=${CMAKE_BUILD_TYPE} -DCMAKE_CXX_STANDARD=${CMAKE_CXX_STANDARD} ) add_library(mysql-connector-cpp INTERFACE) add_dependencies(mysql-connector-cpp mysql-connector-cpp_Proj) # 指向安装后的头文件目录 target_include_directories(mysql-connector-cpp INTERFACE ${MYSQL_CONNECTOR_INSTALL_DIR}/include ) # 添加静态库搜索路径 target_link_directories(mysql-connector-cpp INTERFACE ${MYSQL_CONNECTOR_INSTALL_DIR}/lib ) # 链接静态库文件 target_link_libraries(mysql-connector-cpp INTERFACE mysqlcppconn-static mysqlcppconn8-static )
关键修改点:
- 修正头文件路径为安装目录下的
include(而非编译临时目录) - 添加静态库的搜索路径和具体库名
- 同步主项目的编译类型和C++标准,避免ABI不兼容
2. 修复app库与可执行文件的冗余配置
当前src/app/CMakeLists.txt将main.cpp同时加入了库和可执行文件,导致代码冗余且可能引发链接冲突。修改该文件如下:
set(source src/appLib.cpp ) add_library(app ${source}) target_include_directories(app PUBLIC inc) target_include_directories(app PRIVATE inc/app) target_link_libraries(app PUBLIC common core mysql-connector-cpp ) add_executable(${PROJECT_NAME} src/main.cpp) target_link_libraries(${PROJECT_NAME} app core)
关键修改点:
- 从
app库的源文件列表中移除main.cpp,仅保留业务逻辑代码 - 移除不必要的
add_dependencies声明(CMake会自动处理链接依赖的构建顺序)
3. 额外检查项
- 确认
check函数的声明与实现完全匹配(包括参数类型、const修饰符等),且声明的头文件已被main.cpp正确包含 - 若
check函数属于core或common库,确认这些库已正确编译并包含对应函数的实现
内容的提问来源于stack exchange,提问作者cinargursoy
相关产品推荐
相关产品推荐

