我不确定是否应该将其分为两篇文章...如果是,请告诉我以供将来引用。目前,静态链接和动态链接都存在问题,我将放置明显的文本来划分两者。
我到处寻找,在这里和其他地方都找到了很多解决方案,这些解决方案似乎可以为其他人解决问题......但这些解决方案都不适合我。
提前,我下载了 Boost,它似乎没有附带库 - 并且 make 不会对其所在的目录执行任何操作(不是终端的粉丝,但我不得不 ./configure && make
、make
和 make install
最近做了一些事情;Boost 似乎没有对这些做任何事情)。
我已经在使用 SDL 和我自己的静态库。当然,MySQL Connector/C++ 也不需要。然而,它确实需要 Boost。
静态
最初,我尝试静态链接 MySQL 库,但是失败了,给出了一长串错误(准确地说是 109 - 所有链接器)。如果可能的话,我更喜欢静态链接,因此我将在此处列出一些错误:
"std::istream::gcount() const", referenced from:
sql::mysql::LongDataSender::operator()(std::istream*) const in libMySQL.a(mysql_prepared_statement.cpp.o)
"std::string::find_last_of(char, unsigned long) const", referenced from:
sql::mysql::parseUri(sql::SQLString const&, sql::mysql::MySQL_Uri&) in libMySQL.a(mysql_uri.cpp.o)
"std::string::find_first_of(char, unsigned long) const", referenced from:
sql::mysql::MySQL_ConnectionMetaData::getTablePrivileges(sql::SQLString const&, sql::SQLString const&, sql::SQLString const&) in libMySQL.a(mysql_metadata.cpp.o)
"std::string::find(std::string const&, unsigned long) const", referenced from:
sql::mysql::MySQL_ConnectionMetaData::getColumnPrivileges(sql::SQLString const&, sql::SQLString const&, sql::SQLString const&, sql::SQLString const&) in libMySQL.a(mysql_metadata.cpp.o)
sql::mysql::MySQL_ConnectionMetaData::getIdentifierQuoteString() in libMySQL.a(mysql_metadata.cpp.o)
...
sql::SQLString, boost::detail::variant::void_, boost::detail::variant::void_,
boost::detail::variant::void_, boost::detail::variant::void_,
boost::detail::variant::void_, boost::detail::variant::void_,
boost::detail::variant::void_, boost::detail::variant::void_,
boost::detail::variant::void_, boost::detail::variant::void_,
boost::detail::variant::void_, boost::detail::variant::void_,
boost::detail::variant::void_, boost::detail::variant::void_,
boost::detail::variant::void_, boost::detail::variant::void_>, std::less<sql::SQLString>,
std::allocator<std::pair<sql::SQLString const, boost::variant<int, double, bool,
sql::SQLString, boost::detail::variant::void_, boost::detail::variant::void_,
boost::detail::variant::void_, boost::detail::variant::void_,
boost::detail::variant::void_, boost::detail::variant::void_,
boost::detail::variant::void_, boost::detail::variant::void_,
boost::detail::variant::void_, boost::detail::variant::void_,
boost::detail::variant::void_, boost::detail::variant::void_,
boost::detail::variant::void_, boost::detail::variant::void_,
boost::detail::variant::void_, boost::detail::variant::void_> > > >&) in
libMySQL.a(mysql_connection.cpp.o)
...
对于静态链接,我读过的一些解决方案包含了以下想法……也许库没有被链接。一种解决方案建议链接到 libstdc++。这些几乎是最广泛声称的两个解决方案,但我肯定会链接该库,并且 libstdc++ 根本不会影响错误。
动态
因此,在尝试消除静态链接错误近九个小时后,我决定转向动态库……所有链接器错误都消失了!内容足够了,我尝试运行它并且......
dyld: Library not loaded: libmysqlcppconn.7.dylib
Referenced from: /.../Example.app/Contents/MacOS/Example
Reason: image not found
...太棒了。我的第一 react 是,“哦,对了,我需要将它复制到包中。”所以,很自然地,我去检查了一下。做到了。又跑了。不用找了。今天,我找到了一些解决方案: 进入 Xcode 目录并删除 Derived Data 文件夹,然后尝试再次运行它。没有运气。我没有尝试的唯一解决方案(因为我认为我不能)是更改 dylib 的安装路径。
当我寻找静态库问题的答案时,有人提到 MySQL 站点的连接器存在此问题,但来自不同站点的(可能相同)连接器没有此问题。问题:未提供链接。
出现这些问题时,一些常见的解决方案:
- 项目设置中未列出 header 路径,因此方法为 找不到所调用的。
- 关闭Xcode,删除xCode目录中的Derived Data,打开项目,构建。
- 可能在 64 位项目上使用 32 位库,反之亦然。
- 动态库未复制到 bundle 中。
- 该库不在链接列表中。
- 应该清理然后构建。
现在...在这个列表中,我已经检查以确保它们都正确,因为我知道如何获取它们,并且如前所述,我已经下载了 Boost。是的,我已确保 header 和库路径包含在项目设置中,与 MySQL 的相同。
...有人知道这笔交易可能是什么吗?我还启动了一个全新的 Cocoa 项目,并尝试让 MySQL 只连接到数据库而不做任何其他事情,结果是相同的(静态和动态)。
我正在使用 Mountain Lion 和 Xcode 4.6.2。
最佳答案
对于动态链接,我想你和我有同样的问题。当我编译时,我指定该库位于另一个文件夹中
g++ -I /opt/local/include/ -I /opt/local/include/mysql55-connector-cpp/driver/ -I /opt/local/include/mysql55-connector-cpp/cppconn/ -L libs/ -l mysqlcppconn db_layer.cpp
当您实际运行该文件时,您需要 libmysqlcppconn.7.dylib 库(请注意名称与此完全相同)与可执行文件位于同一文件夹中。
关于c++ - 尝试将 MySQL 链接到项目时出错,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17007848/