2017-12-01 37 views
0

は、私がこのようなプロジェクトを作成するためにcmakeのを使用しているとしますcmakeのリンクはdllファイルを見つけることができません

${root}/lib/CMakeLists.txt 
add_library(FooLib SHARED ${SOURCES}) 

${root}/main/CMakeLists.txt 
add_executable(Main main.cpp) 
target_link_libraries(Main FooLib) 

今私は、Linux(私の場合はFedora)のメインを実行する場合、それは意志FooLib.soを自動ロードします。しかし、Windowsでは、Main.exeはFooLib.dllが見つからないと不平を言うでしょう。 coureseのうち、FooLib.dllをコピーしたり、PATHを手動で指定すると、Main.exeも正常に動作します。

私の質問は、lib &のdllワークフローがWindows上にあるためですか?

Main.exeがLinuxのようにFooLibライブラリのパスを記憶できる方法はありますか?

+0

[WindowsでのDLL検索]の可能な複製(https://stackoverflow.com/questions/2463243/dll-search-on-windows) – Tsyvarev

答えて

0

実行ファイルを静的または動的にリンクする場合、対応するdllはexeと同じフォルダにある必要があります。これは、Windowsアプリケーションの標準的な設計です。主な理由は、dllをロードする際に、エクスポートされた関数の参照を含むexe(これはlibによって提供される)はdllの内部にあるこれらの関数の実装を呼び出します。

あなたのdllは、Windowsのシステム環境のパス/変数として定義されているため、通常はC:\ Program filesまたはc:\ windowsフォルダにあるsystem32フォルダの中に置くことができます。

常に、exeの存在するパスと上記のパスに優先順位が与えられます。 exeがこれらのdllの機能を読み込む可能性があるので、dllの重複がsystem32にないことを確認してください。

+0

ありがとうございますが、役に立たないです。私はすでにあなたが言ったことを知っています。私は、自動検索の方法があるかどうかを尋ねています。手動でlibの検索パスを追加する必要はありません。おそらく、いくつかのcmake関数やmsvc機能が役に立ちます。 – ZenWu

+0

Windows /他の場所にsystem32ファイルパスを追加する必要はありません。デフォルトでは、システムによって追加されます。システム環境変数の一覧を確認できます。そこに%SystemRoot%\ system32パスがあります。しかし、あなたはこのフォルダにあなたのdllを置く必要があります。 –