cygwin でソースから MySQL の「Connector/C」をビルドしようとしていますが、問題があります。
-いくつかのコンテキスト-
誰もがcygwinを使いたがる理由について、私たちは多くのことを話すことができました。libmysql
この場合、Windows ボックスで cygwin ツール セットを使用して UNIX 開発を行う方が簡単です。
私の調査によると、コネクタの古いバージョン (おそらく 5.1) を取得して問題なくビルドできるようです。./configure
しかし、MySQL 開発者がビルド構成をcmake
ドリブンから切り替えたとき、cygwin のサポートは終了しました。
MySQL がダウンロード用に提供するソース tar-ball のバージョンは 6.0.2 で、私が取り組んでいるものです。
-1つの(一種の)解決された問題-
dtoa()
最初に遭遇した問題は、 found inの互換性のない再宣言でしたstdlib.h
。(さまざまな最近のバージョンをビルドしようとした他の多くの人も、この問題に遭遇しました-Googleがガイドである場合。)これを解決するためのさまざまな提案がネット上に潜んでいます。私の選択:定義stdlib.h
が削除されたものに一時的に置き換えます。醜い、本当。しかし、それは機能します。dtoa()
(この「修正」により、初期のコンパイル エラーが解消され、プロセスは明らかに無関係な理由で失敗するリンクまで実行されます。)
~未解決問題~
libmysql
コードは に依存していますyaSSL
。これは、cygwin setup-tool/package-manager を使用して環境にパッケージを追加した後にのみ受け入れられるパラメーターを指定しcmake
たにもかかわらず、当てはまるようです。「純粋仮想」クラスメンバーを使用しているようです。C++ の内部構造に関する私の (ある程度限定された) 知識から、これは、コンパイラが暗黙的に特別なシンボル/関数の宣言を想定し、これによりリンカーが関数の (単一の) 定義を検索することを意味します。-DWITH_OPENSSL=1
openssl-devel
yaSSL
__cxa_pure_virtual()
__cxa_pure_virtual()
コードとビルド プロセスが構造化されている方法では、各yaSSL
ソース実装ファイルがオブジェクト ファイルにコンパイルされます。これらのファイルの多くは、 を定義する (つまり、の実装を含む) 別のファイルを参照します__cxa_pure_virtual()
。リンク段階では、定義を含む各オブジェクトが互いに競合します。(シンボルがextern
、またはより具体的には次のように定義されているため:
extern "C" {
int __cxa_pure_virtual() {
assert("Pure virtual method called." == "Aborted");
return 0;
}
}
これらの定義は、共有名前空間にあります。したがって、リンカには、各参照からどれにリンクするかを決定する規則が与えられていません。) 結果は です。multiple definition error
たとえば、次のようになります。
CMakeFiles/libmysql.dir/__/extlib/yassl/taocrypt/src/algebra.cpp.o:algebra.cpp:(.text+0x40): multiple definition of `___cxa_pure_virtual'
CMakeFiles/libmysql.dir/__/extlib/yassl/taocrypt/src/aes.cpp.o:aes.cpp:(.text+0x0): first defined here
この問題を解決するために、非常に単純化した試みをいくつか試しました。
- のすべての定義を削除しまし
__cxa_pure_virtual()
たが、それは複数定義エラーを未定義参照エラーに置き換えるだけです。 - コンパイラがインラインで使用された関数から外部参照を削除することを望んでいましたが、すべての定義を無駄に変更
__cxa_pure_virtual()
しました。inline
(C++ がルックアップ テーブルを間接層としていつ使用するかはわかりませんが、その場合はオプションではない可能性があります。) そのテストの特定の結果を思い出すと、定義がないinline
場合と同じ結果が作成されました。の。__cxa_pure_virtual()
libmysql
ソースで純粋仮想関数の使用法を探し始めましたが、それはうさぎの穴のように思えました...- 独立したオブジェクト ファイルにの定義を配置するためにビルド プロセスを検討することを検討しました (その後、他のすべてのオブジェクト ファイルから定義を削除します)。
__cxa_pure_virtual()
間の(および含む)オプションを探しています
- 有用なものを構築するためのプロジェクトへの最小限の変更、および
- 現在サポートされているすべてのプラットフォームとcygwinでビルド プロセスを正しく動作させる正しいパッチ セット。
「中間」とは、考慮すべきいくつかの中間の選択肢がある可能性があるためです。したがって、私の見方では、ここで最も重要な質問は、「(このコンテキストで) 複数定義エラーの最も単純/最も簡単な修正は何ですか?」ということです。「ビルド プロセスを cygwin に (レポート) 移植できるようにするには、どのようなことを MySQL チームにフィードバックする必要がありますか?」
~最後に~
MySQL の開発者が cygwin のサポートを放棄した場合、何がそのプラットフォームに彼らの注意を戻すのかわかりません。
私は、cygwin で作業する理由がある開発者が、MySQL コネクタの cygwin/unix ビルドに対してコードをテストするオプションを保持できることを望んでいます。
少なくとも、コネクタの最新バージョン (および、最近のいくつかのバージョン) を cygwin で有効に構築するための最小限のハック セットを含むナレッジ ベースを維持しているコミュニティには、何らかの価値があるかもしれません。そのための良い第一歩は、ここでのスタックオーバーフローに関する議論かもしれません。おそらく、このスレッドのコメントや回答としてもよいでしょう。