web-dev-qa-db-ja.com

cmakeを使用してWindowsを構築する簡単な例DLL

数年前、私は北東部(おそらく「ダウンイースト」)にあるパートナーエンジニアリング機関からこの巨大なパッケージを構築して変更することに夢中になりました。このパッケージは、Linuxをターゲットとして「cmake」と呼ばれるものを使用して構築されました... cmake、IMHOは、私の限られた能力(28年* NIXシステムとlotsaオープンソースコードの構築に関する専門的な経験)。

次に、MSVSを対象とした「cmake」を使用して別のプロジェクトを構築する必要がありました。ああ、ジョイ!最後に、これらの厄介な「プロジェクト」ファイルと「ソリューション」ファイルを確実に生成できる何か。そして、それらの同じCMakeLists.txtファイルはLinuxを再ターゲットする可能性があります!うわー、私は光を見ました。

でも、私がいる場所はまだかなり暗いです。最初にCMakeLists.txtファイルがない限り、最初から最初から始めて、最も単純な問題のためにそのプロセスに1日もかからずに頭を悩ませることはできないようです。

Ctypesを使用してDLLスクリプトからアクセスできるMSVSでPythonを構築するタスクがあります。基本的に、それはオンボードのシンボルを持つDLLを意味します。 VS2008とVS2010のインストールで新しいC++プロジェクトを作成できないという、10年前のバグがあるので、cmakeを使用してDLLソリューションを生成することにしました。

Cmakeを使用してDLLを構築する最新の(別名post cmake 2.8.5)COMPLETEの例を見つけることができませんでした。これは、このタスクで以前よりもはるかに優れていると思われます。

チュートリアルを詳しく説明しました http://www.cmake.org/cmake/help/cmake_tutorial.html これは、cmakeの学習中にC++コードを作成することを期待しているため恐ろしいことです。 (ねえ、男!cmakeを動作させるのに十分な問題があり、コンパイルするコードを作成します!)チュートリアルでは、単純なバイナリを作成してから、ライブラリを使用してバイナリを作成しますが、DLLは生成されません。

http://www.cmake.org/Wiki/BuildingWinDLL を読んで、行の間に、libディレクトリのCMakeLists.txtファイルにいくつかのコードを素朴に追加しました。

前:

add_library(MathFunctions mysqrt.cxx)

install (TARGETS MathFunctions DESTINATION bin)
install (FILES MathFunctions.h DESTINATION include)

後:

add_library(MathFunctions SHARED mysqrt.cxx)
GENERATE_EXPORT_HEADER( MathFunctions
             BASE_NAME MathFunctions
             EXPORT_MACRO_NAME MathFunctions_EXPORT
             EXPORT_FILE_NAME MathFunctions_Export.h
             STATIC_DEFINE MathFunctions_BUILT_AS_STATIC
)
install (TARGETS MathFunctions DESTINATION bin)
install (FILES MathFunctions.h DESTINATION include)

cmake3.0.0とcmake2.8.12.2はどちらも、このファイルで次のようにウィンジします。

CMake Error at MathFunctions/CMakeLists.txt:2 (GENERATE_EXPORT_HEADER):
  Unknown CMake command "GENERATE_EXPORT_HEADER".

関数はGenerateExportHeader.cmakeとしてcmakeインストールにあるように見え、デバッグの量はこのエラーの「理由」を明らかにしませんでした。そして、私はインターネット上でこのエラーを見つけることができませんでした。

そしてそれは私の一日の最初の6時間でした。

私はついに問題のあるコマンドを削除してこれを試すことにしました:

add_library(MathFunctions mysqrt.cxx)

install (TARGETS MathFunctions DESTINATION bin)
install (FILES MathFunctions.h DESTINATION include)

ワラ! cmakeが構成および生成され、MSVSが正常にビルドし、ライブラリディレクトリのDebugサブディレクトリにDLLが表示されました。クエル。

ただし、このDLLには、python/ctypesが目的の関数にアクセスできるようにするシンボルが含まれていませんでした。 BuildingWinDLLページをさらにルート化した後、私はなんとかシンボルを引き出すことができました。 Pythonはとても嬉しかったです。失礼で単純なハックですが、将来の作業のモデルができました。

だから、その長い議論の後:

  • Cmake 2.8.5以降を参照しているBuildingWinDLLは、単に間違っていますか?
  • これを行う正しい方法は何でしたか?
  • ハックを捨てることができるように、ハックではないエクスポートされたシンボルを使用してMSVS DLLを作成する簡単な「cmake101」の例を持っている人はいますか?

PS:ここstackoverflowでとても素敵でフレンドリーな記事構成システム。私は戻って許可されていると仮定して、これを楽しみます...

steveireからの回答後の更新:

元の質問に答えましたが、BuildingWinDLLページのヒントを見逃していることがわかりました。また、例のフィールドの1つを自分のコードに変更できなかったこともわかりました。

これで、次のレイヤーに進みます。参照されている例を使用すると、VS2010ソリューションビルドは次のように文句を言います。

LINK : fatal error LNK1104: cannot open file 'MathFunctions\Debug\MathFunctions.lib'

私はBuildingWinDLLから、GENERATE_EXPORT_HEADER()がDLLの構築に関してすべて歌い、すべて踊っていることを収集しました。 .libファイルが生成されておらず、生成された.dllにシンボルが含まれていません。

BuildingWinDLLページでは、cmake-2.8.5より前のプロセスについて説明しています。ページ上部に記載されている2.8.5プロセスは、ページ下部のファイルがGENERATE_EXPORT_HEADER()を使用して自動的に生成される方法です。 それでもピースを一緒に編む必要がありますが、それはテキストからはわかりません。

したがって、MathFunctions_Export.hは、GENERATE_EXPORT_HEADER()cmakeコマンドとここに示されている特定のパラメーターによって生成され、シンボルをエクスポートするためのマクロを含むCヘッダーを作成します。このファイルは明らかに明示的に参照する必要があり、エクスポートするシンボルは適切に修飾されています。

#include <math.h>
#include <Mathfunctions/MathFunctions_Export.h>

MathFunctions_EXPORT double mysqrt(double v) {
    return sqrt(v);
}

#includeと* EXPORT修飾子を追加すると、シンボルがエクスポートされ、VSは.libを生成し、.dllにシンボルを入力することを認識します。

成功!このプロセスを助け、私の痛みで私と一緒に苦しんだすべての人に感謝します。

include(GenerateExportHeader)

使用する前に。

http://www.cmake.org/cmake/help/v3.0/module/GenerateExportHeader.html

CMakeはデフォルトで静的ライブラリを構築するため、共有ライブラリを構築する場合はSHAREDを保持します。

6
steveire