运行C++可执行文件时出现(No such file)错误——MySQL Connector/C++库链接问题
运行C可执行文件时出现(No such file)错误——MySQL Connector/C库链接问题
嘿,我完全懂你这种在Mac上折腾CMake、MySQL Connector/C++时处处碰壁的感觉!尤其是运行时弹出**「No such file」**的错误,大概率是动态库链接或者路径配置出了问题,我来给你一步步捋清楚解决办法:
第一步:确保CMake配置文件正确
首先在你的项目根目录(/Users/{user}/Documents/Projects/SQL/)创建一个CMakeLists.txt,内容如下:
cmake_minimum_required(VERSION 3.20) project(SQLProject) # 指定C++标准,Connector/C++ 9.3建议用C++17及以上 set(CMAKE_CXX_STANDARD 17) # 查找MySQL Connector/C++库 find_package(MySQLConnectorCPP REQUIRED) # 查找OpenSSL依赖(Connector/C++ 9.3依赖OpenSSL) find_package(OpenSSL REQUIRED) # 指定可执行文件名称和源文件路径 add_executable(sql_app src/main.cpp) # 链接所需的库文件 target_link_libraries(sql_app PRIVATE MySQLConnectorCPP::mysqlcppconn8 OpenSSL::SSL OpenSSL::Crypto)
如果是手动下载的Connector/C++,编译时需要告诉CMake库的路径,在终端执行以下命令:
cd /Users/{user}/Documents/Projects/SQL mkdir build && cd build # 替换成你实际的Connector/C++解压路径 cmake .. -DCMAKE_PREFIX_PATH=/path/to/mysql-connector-c++-9.3.0-macos14-x86_64 make
要是你用Homebrew安装的Connector/C++,直接执行cmake .. && make就行,CMake会自动找到库路径。
第二步:解决运行时动态库找不到的问题
编译成功但运行时提示找不到文件,是Mac的动态库加载路径没配置好,这里有三个实用方法:
- 临时指定路径运行:在运行可执行文件时手动指定库路径
# 替换成你的Connector/C++ lib目录路径 DYLD_LIBRARY_PATH=/path/to/mysql-connector-c++-9.3.0-macos14-x86_64/lib ./sql_app - 编译时嵌入库路径:修改
CMakeLists.txt,添加rpath配置,让可执行文件记住库的位置,这样后续运行就不用手动指定路径了
在target_link_libraries后面添加:
重新编译后直接运行set_target_properties(sql_app PROPERTIES INSTALL_RPATH "/path/to/mysql-connector-c++-9.3.0-macos14-x86_64/lib" BUILD_WITH_INSTALL_RPATH ON )./sql_app即可。 - 用Homebrew安装库(最省心):如果之前是手动下载的,不妨换成Homebrew安装,它会自动处理库路径:
之后重新配置CMake编译,运行时就不会有路径问题了。brew install mysql-connector-c++
额外检查:代码的头文件是否正确
Connector/C++ 9.3默认使用新的X DevAPI,代码里要引入正确的头文件,示例代码如下:
#include <mysqlx/xdevapi.h> #include <iostream> using namespace mysqlx; int main() { try { // 替换成你的MySQL账号密码,注意端口是33060(X DevAPI端口) Session sess("localhost", 33060, "your_username", "your_password"); std::cout << "连接成功!" << std::endl; sess.close(); } catch (const mysqlx::Error& err) { std::cerr << "错误信息:" << err.what() << std::endl; return 1; } return 0; }
备注:内容来源于stack exchange,提问作者Charles Florestal
相关产品推荐
相关产品推荐

