2017-07-13 45 views
0

私は単純なC++ライブラリを構築しようとしています。相対パスを使って構築する過程で、CMakeは自分のリンクライブラリがどこにあるのかを正しく設定できませんでした。絶対パス設定で成功しました。これは、CMakeの使用を止めさせるものの中にあります。パスを設定するための推奨方法は何ですか?それは絶対パスか相対パスか、なぜですか?CMakeの相対パスに対する絶対パス

+0

を持っていますどういうわけかあなたのプロジェクトがあなたとは別のマシン上に構築されるなら、絶対パスで何が起こるかを考えましたか? – JBL

+0

環境変数に格納されたパスを使ってみませんか? – Aziuth

+0

CMakeはほとんど絶対パスを使います。しかし、すべてがCMakeシステム変数に関連して定義することができます。これはユーザのカスタマイズも可能であり、サブディレクトリは親変数を継承しますが、これは開発者またはユーザのためのものではありません。最小限の完全なコードを投稿するだけで、より有用なヘルプを得ることができます。 – utopia

答えて

2

所与:cmake -H/foo -B/bar/foo/CMakeLists.txtの実行中

${CMAKE_CURRENT_SOURCE_DIR} = /foo 
${CMAKE_CURRENT_BINARY_DIR} = /bar 

/foo/foo2/CMakeLists.txtを実行ステートメントすなわち文add_subdirectory(foo2)、中次いでproject(Foo)

${PROJECT_SOURCE_DIR} = /foo 
${PROJECT_BINARY_DIR} = /bar 

後:

私たちは別のネストされたプロジェクトが発生した場合
${CMAKE_CURRENT_SOURCE_DIR} = /foo/foo2 
${CMAKE_CURRENT_BINARY_DIR} = /bar/foo2 
${PROJECT_SOURCE_DIR} = /foo 
${PROJECT_BINARY_DIR} = /bar 

project(Bar)

${CMAKE_CURRENT_SOURCE_DIR} = /foo/foo2 
${CMAKE_CURRENT_BINARY_DIR} = /bar/foo2 
${PROJECT_SOURCE_DIR} = /foo/foo2 
${PROJECT_BINARY_DIR} = /bar/foo2 

あなたが見つけるために役立つと位置を正確にファイルされます他の多くの変数がありますが、そのようadd_executableなど

https://cmake.org/Wiki/CMake_Useful_Variables

コマンドを参照してください非明示的なファイルがどこにあるのかを把握しようとしますが、複雑なプロジェクトではそれに頼るのは良い考えではありません。パスを明示的に提供する方が良い(利用可能なCMAKE変数を使用する)。

最後に、cmakeを定期的に使用すると、ソースファイルの構成が弱点であるという結論に至ります。

あなたは私のような幸運であれば、あなたはSugarパッケージ全体につまずくます:

https://github.com/ruslo/sugar

そして、すべてのソースファイル(およびドキュメント)の悲哀が消えます。

あなたがクロスコンパイルする場合は、ポリーをお勧めします:

https://github.com/ruslo/polly

そして、あなたは一般的なサードパーティのライブラリに依存している場合はうまくハンターから利益を得ることができる:

https://github.com/ruslo/hunter

関連する問題