2017-11-06 4 views
1

だが、私は2つのライブラリfoobar、および実行可能appとcmakeのプロジェクトを持っているとしましょうcmakeのプロジェクトにDLLをコピーしますエラーLNK1104 - cannot open file 'bar.lib'で失敗しました。私は間違って何をしていますか?これは最も基本的な例のようなものですが、どうすれば失敗するのでしょうか?私はVisual Studio 15.4.2(MSVC 14.11.25503)とCMake 3.9.1でコンパイルしています。は推移的

次の質問、私は私のfoo.dllbar.dllが自動的app.exeは(私はそれが$<TARGET_FILE_DIR:app>だろうと仮定)にコンパイルされるフォルダにコピーすることにしたいです。 fooとにリンクされている方法を変更することなく、foobarにプロパティ/カスタムコマンドを追加することで、を実行できますか?app?言い換えれば

、私は新しいターゲットの実行ファイルapp2を追加した場合、target_link_libraries(app2 foo)への単純な呼び出しが私はfoo.dllbar.dllが先にコピー持っているを必要とするすべてである、ように上記のスクリプトを変更したいですapp2のフォルダ。

私がこれまで持っている問題は、既存のソリューションは、私はちょうどadd_custom_command(foo ...)appapp2ので、任意のフォルダに終わることができ、add_custom_command(... COMMAND ${CMAKE_COMMAND} -E copy_if_different ...)が明示的に最終ターゲットappapp2に追加する必要がないことができ関与するということです。

私はtarget_link_libraries(app ...)を自分の関数(dllをコピーするもの)にラップし、古い_target_link_libraries(app ...)を呼び出すことを考えていましたが、これはきれいな方法であれば分かりません。それには良い方法があります。

最後に、われわれが見つけた解決策は、IMPORTEDのCMakeサブプロジェクトとしてコンパイルされていないターゲットとライブラリでも動作したいと思います。

答えて

1

だから、最初、私はWindows上でこのプロジェクトをコンパイルしようとすると、それはエラーLNK1104と を失敗しました - オープンファイル「bar.lib」することはできません。私は何をしています が間違っていますか?

あなたのライブラリーは、インポートライブラリ(彼は不満だ.libファイル)を作成していない理由です、何もエクスポートしません。ソースファイルで実際にいくつかのシンボルが定義されていることを確認してから、それらのシンボルがDLLから実際にエクスポートされていることを確認してください。 CMakeはa module that provides portable macros for exporting symbolsと一緒に出荷されます。

次の質問は、私は私のfoo.dllとbar.dllが自動的 app.exeのは(私はそれが さ$と仮定)にコンパイルされるフォルダにコピーすることにしたいです。プロパティ/カスタム コマンドをfooとbarに追加することで、fooとbarがアプリにリンクされている方法を変更せずにそれを実行できますか?

残念ながら、CMakeは現時点でランタイム依存性管理を適切にサポートしていません。これは、target_link_librariesへの簡単な呼び出しでこれが動作しないようにします。このような機能は既にCMake開発者の間で数回にわたって議論されていますが、驚くほど正しいことは難しいようです(私はここでも細部に精通していません)。

私が思いつく最も便利な方法は、提供するライブラリに、関連するすべてのDLLを引数として与えられたCMakeにコピーするCMake functionを提供することです。それでも痛みはありますが、少なくとも提供ライブラリでどのDLLをコピーするかについての詳細は把握しておいてください。

+0

[私のgithubプロジェクトの1つ](https://github.com/ComicSansMS/GhulbusBase/blob/master/cmake/gbBaseMacros.cmake.in)のDLLをコピーするためのこの方法を実装しました。全体的なメカニズムは非常に複雑です。[config-fileパッケージシステム](https://cmake.org/cmake/help/v3.9/manual/cmake-packages.7.html#config- file-packages)が、この問題でCMakeから得ることができるサポートの程度を説明するのに役立つかもしれません。 – ComicSansMS

+0

ありがとうございます。私はすでに同様の機能を実装しています(これはあなたのものをほぼそのままコピーしたものです)。私は私が逃したより便利な解決策を見つけることを望んでいた。 – skuld

関連する問題