编译MariaDB C++连接代码时无法找到libmariadbcpp库的问题
解决C++连接MariaDB的编译链接错误
问题分析
你遇到两类典型编译链接问题:
- 库不兼容/找不到:ld提示跳过不兼容的
libmariadbcpp.so,说明系统中库的架构(32/64位)与编译环境不匹配,或库路径未被编译器识别。 - 未定义引用:错误地将库文件路径传给
-L参数(-L要求传入目录路径而非具体.so文件),导致编译器未正确链接库。
修复步骤
1. 修正编译命令参数格式
-L后需指定库所在目录,再用-l指定库名。若你的C++连接器库位于/usr/local/lib/mariadb/,正确编译命令如下:
g++ -o code code.cpp -std=c++11 -I/usr/local/include/mariadb/conncpp/ -L/usr/local/lib/mariadb/ -lmariadbcpp -lmariadbclient
参数说明:
-I:指定头文件搜索目录(解决mariadb/conncpp.hpp路径问题)-L:指定库文件搜索目录-lmariadbcpp:链接MariaDB C++连接器库-lmariadbclient:链接依赖的MariaDB C客户端库(C++连接器依赖此库)
2. 验证库架构匹配性
若仍提示“skipping incompatible”,检查系统与库的架构是否一致:
- 查看系统架构:
uname -m(x86_64为64位,i386/i686为32位) - 查看库架构:
file /usr/local/lib/mariadb/libmariadbcpp.so
若架构不匹配,重新编译对应架构的C++连接器。
3. 修复代码语法错误
你的代码中创建Properties对象时未赋值给变量,修改为:
sql::Properties properties({{"user", "root"}, {"password", ""}});
附:问题中的代码与错误信息
代码示例
// Includes #include <iostream> #include <mariadb/conncpp.hpp> // Main Process int main(int argc, char **argv) { try { // Instantiate Driver sql::Driver* driver = sql::mariadb::get_driver_instance(); // Configure Connection, including initial database name "test": sql::SQLString url("jdbc:mariadb://localhost:3306/test"); // Use a properties map for the other connection options sql::Properties({{"user", "root"}, {"password", ""}}); // Establish Connection // Use a smart pointer for extra safety std::unique_ptr<sql::Connection> conn(driver->connect(url, properties)); // Use Connection // ... // Close Connection conn->close(); } // Catch Exceptions catch (sql::SQLException& e) { std::cerr << "Error Connecting to the database: " << e.what() << std::endl; // Exit (Failed) return 1; } // Exit (Success) return 0; }
初始错误信息
/usr/bin/ld: skipping incompatible /usr/lib/gcc/x86_64-linux-gnu/11/../../../../lib/libmariadbcpp.so when searching for -lmariadbcpp /usr/bin/ld: skipping incompatible /lib/../lib/libmariadbcpp.so when searching for -lmariadbcpp /usr/bin/ld: skipping incompatible /usr/lib/../lib/libmariadbcpp.so when searching for -lmariadbcpp /usr/bin/ld: skipping incompatible /usr/lib/gcc/x86_64-linux-gnu/11/../../../libmariadbcpp.so when searching for -lmariadbcpp /usr/bin/ld: skipping incompatible /lib/libmariadbcpp.so when searching for -lmariadbcpp /usr/bin/ld: skipping incompatible /usr/lib/libmariadbcpp.so when searching for -lmariadbcpp /usr/bin/ld: cannot find -lmariadbcpp: No such file or directory /usr/bin/ld: skipping incompatible /usr/lib/gcc/x86_64-linux-gnu/11/../../../../lib/libmariadbcpp.so when searching for -lmariadbcpp /usr/bin/ld: skipping incompatible /lib/../lib/libmariadbcpp.so when searching for -lmariadbcpp /usr/bin/ld: skipping incompatible /usr/lib/../lib/libmariadbcpp.so when searching for -lmariadbcpp /usr/bin/ld: skipping incompatible /usr/lib/gcc/x86_64-linux-gnu/11/../../../libmariadbcpp.so when searching for -lmariadbcpp /usr/bin/ld: skipping incompatible /lib/libmariadbcpp.so when searching for -lmariadbcpp /usr/bin/ld: skipping incompatible /usr/lib/libmariadbcpp.so when searching for -lmariadbcpp collect2: error: ld returned 1 exit status
改用-L后的错误信息
/usr/bin/ld: /tmp/ccblDiuQ.o: in function `main': code.cpp:(.text+0x31): undefined reference to `sql::mariadb::get_driver_instance()' /usr/bin/ld: code.cpp:(.text+0x51): undefined reference to `sql::SQLString::SQLString(char const*)' /usr/bin/ld: code.cpp:(.text+0x194): undefined reference to `sql::SQLString::~SQLString()' /usr/bin/ld: code.cpp:(.text+0x23c): undefined reference to `sql::SQLString::~SQLString()' /usr/bin/ld: /tmp/ccblDiuQ.o: in function `std::pair<sql::SQLString const, sql::SQLString>::~pair()': code.cpp:(.text._ZNSt4pairIKN3sql9SQLStringES1_ED2Ev[_ZNSt4pairIKN3sql9SQLStringES1_ED5Ev]+0x1c): undefined reference to `sql::SQLString::~SQLString()' /usr/bin/ld: code.cpp:(.text._ZNSt4pairIKN3sql9SQLStringES1_ED2Ev[_ZNSt4pairIKN3sql9SQLStringES1_ED5Ev]+0x28): undefined reference to `sql::SQLString::~SQLString()' /usr/bin/ld: /tmp/ccblDiuQ.o: in function `std::pair<sql::SQLString const, sql::SQLString>::pair<char const (&) [5], char const (&) [11], true>(char const (&) [5], char const (&) [11])': code.cpp:(.text._ZNSt4pairIKN3sql9SQLStringES1_EC1IRA5_KcRA11_S5_Lb1EEEOT_OT0_[_ZNSt4pairIKN3sql9SQLStringES1_EC1IRA5_KcRA11_S5_Lb1EEEOT_OT0_]+0x30): undefined reference to `sql::SQLString::SQLString(char const*)' /usr/bin/ld: code.cpp:(.text._ZNSt4pairIKN3sql9SQLStringES1_EC1IRA5_KcRA11_S5_Lb1EEEOT_OT0_[_ZNSt4pairIKN3sql9SQLStringES1_EC1IRA5_KcRA11_S5_Lb1EEEOT_OT0_]+0x4f): undefined reference to `sql::SQLString::SQLString(char const*)' /usr/bin/ld: code.cpp:(.text._ZNSt4pairIKN3sql9SQLStringES1_EC1IRA5_KcRA11_S5_Lb1EEEOT_OT0_[_ZNSt4pairIKN3sql9SQLStringES1_EC1IRA5_KcRA11_S5_Lb1EEEOT_OT0_]+0x64): undefined reference to `sql::SQLString::~SQLString()' /usr/bin/ld: /tmp/ccblDiuQ.o: in function `std::pair<sql::SQLString const, sql::SQLString>::pair<char const (&) [9], char const (&) [9], true>(char const (&) [9], char const (&) [9])': code.cpp:(.text._ZNSt4pairIKN3sql9SQLStringES1_EC1IRA9_KcS7_Lb1EEEOT_OT0_[_ZNSt4pairIKN3sql9SQLStringES1_EC1IRA9_KcS7_Lb1EEEOT_OT0_]+0x30): undefined reference to `sql::SQLString::SQLString(char const*)' /usr/bin/ld: code.cpp:(.text._ZNSt4pairIKN3sql9SQLStringES1_EC1IRA9_KcS7_Lb1EEEOT_OT0_[_ZNSt4pairIKN3sql9SQLStringES1_EC1IRA9_KcS7_Lb1EEEOT_OT0_]+0x4f): undefined reference to `sql::SQLString::SQLString(char const*)' /usr/bin/ld: code.cpp:(.text._ZNSt4pairIKN3sql9SQLStringES1_EC1IRA9_KcS7_Lb1EEEOT_OT0_[_ZNSt4pairIKN3sql9SQLStringES1_EC1IRA9_KcS7_Lb1EEEOT_OT0_]+0x64): undefined reference to `sql::SQLString::~SQLString()' /usr/bin/ld: /tmp/ccblDiuQ.o: in function `std::less<sql::SQLString>::operator()(sql::SQLString const&, sql::SQLString const&) const': code.cpp:(.text._ZNKSt4lessIN3sql9SQLStringEEclERKS1_S4_[_ZNKSt4lessIN3sql9SQLStringEEclERKS1_S4_]+0x27): undefined reference to `sql::SQLString::operator<(sql::SQLString const&) const' /usr/bin/ld: /tmp/ccblDiuQ.o: in function `std::pair<sql::SQLString const, sql::SQLString>::pair(std::pair<sql::SQLString const, sql::SQLString> const&)': code.cpp:(.text._ZNSt4pairIKN3sql9SQLStringES1_EC2ERKS3_[_ZNSt4pairIKN3sql9SQLStringES1_EC5ERKS3_]+0x24): undefined reference to `sql::SQLString::SQLString(sql::SQLString const&)' /usr/bin/ld: code.cpp:(.text._ZNSt4pairIKN3sql9SQLStringES1_EC2ERKS3_[_ZNSt4pairIKN3sql9SQLStringES1_EC5ERKS3_]+0x3f): undefined reference to `sql::SQLString::SQLString(sql::SQLString const&)' /usr/bin/ld: code.cpp:(.text._ZNSt4pairIKN3sql9SQLStringES1_EC2ERKS3_[_ZNSt4pairIKN3sql9SQLStringES1_EC5ERKS3_]+0x54): undefined reference to `sql::SQLString::~SQLString()' /usr/bin/ld: /tmp/ccblDiuQ.o:(.data.rel.local.DW.ref._ZTIN3sql12SQLExceptionE[DW.ref._ZTIN3sql12SQLExceptionE]+0x0): undefined reference to `typeinfo for sql::SQLException' collect2: error: ld returned 1 exit status
内容的提问来源于stack exchange,提问作者fisherbone
相关产品推荐
相关产品推荐

