2

我不确定是否应该将其分为两个帖子...如果是这样,请告诉我以供将来参考。目前,静态链接和动态链接都存在问题,我将放置明显的文本来区分两者。

我到处寻找,在这里和其他地方发现了很多似乎可以解决其他人的问题的解决方案......但这些解决方案都没有对我有用。

提前,我下载了 Boost 并且它似乎没有附带一个库 - 并且 make 对它所在的目录没有做任何事情(不是终端的粉丝,但我不得不这样做./configure && make,最近make还有make install一些事情; Boost 似乎对此没有任何作用)。

我已经在使用 SDL 和我自己的静态库。当然,MySQL 连接器/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

... 精彩的。我的第一反应是,“哦,对了,我需要把它复制到包中。” 所以,很自然地,我去检查了。做到了。又跑了。没变。今天,我找到了几个解决方案: 到 Xcode 目录,删除 Derived Data 文件夹,然后尝试再次运行。没运气。我没有尝试的唯一解决方案(因为我认为我做不到)是更改 dylib 的安装路径。

当我在寻找静态库问题的答案时,有人提到 MySQL 站点的连接器有这个问题,但是来自不同站点的(假设相同)连接器没有问题。问题:没有给出链接。

当这些问题出现时,一些经常声称的解决方案:

  • 项目设置中未列出标头路径,因此找不到被调用的方法。
  • 关闭Xcode,删除xCode目录下的Derived Data,打开项目,构建。
  • 可能在 64 位项目上使用 32 位库,反之亦然。
  • 动态库没有被复制到包中。
  • 库不在链接列表中。
  • 应该清理然后构建。

现在......在这个列表中,我已经检查以确保它们都正确,因为我知道如何获取它们,并且如前所述,我已经下载了 Boost。是的,我已确保项目设置中包含头文件和库路径,与 MySQL 相同。

...有人知道这笔交易可能是什么吗?我还开始了一个全新的 Cocoa 项目,并试图让 MySQL 只连接到数据库而不是其他任何东西,结果是相同的(静态和动态两者)。

我正在使用 Mountain Lion 和 Xcode 4.6.2。

4

2 回答 2

3

对于动态链接,我认为你和我有同样的问题。当我编译时,我指定该库在另一个文件夹中

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 库(注意名称与此完全相同)与您的可执行文件位于同一文件夹中。

于 2013-10-17T13:15:03.037 回答
0

不幸的是,根据这篇文章,我遇到了与您在此处描述的相同的问题,即使您确实可以编译它,它也不会正确链接,您必须使用正确的编译器标志自己编译它. 也就是说,一旦您正确编译了可执行文件,您就可以使用本页中描述的工具告诉它在您的 Frameworks 文件夹中查找 dyld。

祝你好运。

于 2013-06-28T04:26:06.557 回答