0

次の構造を持つプロジェクトの cmake ファイルを作成しています

project/ (root)
  libraries/ (contains (precompiled) libraries
  src/
    code/ (contains a set of fortran files)

私のCMakeLists.txtファイルは現在入っていてproject/、事実上

cmake_minimum_required(VERSION 2.6)

enable_language(Fortran)
project(project1)

set(projsrc src/code)

set(libdir lib/)

find_library(PROJ_LIBRARY pr10 PATHS ${libdir})

add_executable (sc1 sc1.f90)
target_link_libraries(sc1 ${PROJ_LIBRARY})

srcこれにより、実際に上のレベル(つまり、フォルダー内-この構造は変更されるため、bin最終的にフォルダーが作成されます)に必要なときに、ソースコードと同じフォルダーにバイナリが作成されますが、どうすればよいかわかりませんそれ。

SO に関するいくつかの回答では、すべてのフォルダーに CMakeLists.txt ファイルが必要であると言われていますが、これは正しいですか? 環境変数を設定するか、CMake 変数を使用することは可能ですか (例: http://cmake.org/cmake/help/v2.8.8/cmake.html#command:set )。彼らが投稿したソリューションがC++固有のものであるかどうかも、いくつかの回答からはあまり明確ではありません(CMakeが最も頻繁に使用される言語であるため)。

編集

少し変更することで、必要な動作に変更できることがわかりました。

cmake_minimum_required(VERSION 2.6)
enable_language(Fortran)
project(project1)

set(projsrc src/code)

set(libdir lib/)

find_library(PROJ_LIBRARY pr10 PATHS ${libdir})

add_executable (src/sc1 ${projsrc}/sc1.f90)
target_link_libraries(src/sc1 ${PROJ_LIBRARY})

ただし、以下の arrowdodger によると、これは私の行動が本来あるべき姿と異なる理由を説明していません。また、環境変数の値を表示する方法もまだ模索中です。私は運がないので、次のことを試しました:

message(${RUNTIME_OUTPUT_DIRECTORY})
message($ENV{RUNTIME_OUTPUT_DIRECTORY})
message(${CMAKE_RUNTIME_OUTPUT_DIRECTORY})
message($ENV{CMAKE_RUNTIME_OUTPUT_DIRECTORY})
4

1 に答える 1

0

デフォルトでは、バイナリはビルド ディレクトリのそれぞれのサブディレクトリに表示されます。CMakeLists.txtそれぞれ、呼び出しを含むディレクトリを意味しadd_executable()ます。

たとえば、次の場合CMakeLists.txt

add_executable(tgt1 src1.f90)
add_executable(tgt2 subdir/src2.f90)

ルート フォルダーでは、両方のバイナリを${CMAKE_BINARY_DIR}. したがって、 に参加したい場合tgt2${CMAKE_BINARY_DIR}/subdir、そこに CMakeLists.txt を追加して、そこから呼び出す必要がadd_executable(tgt2 src2.f90)あります。

この動作は次のように変更できます。

CMAKE_LIBRARY_OUTPUT_DIRECTORYCMAKE_RUNTIME_OUTPUT_DIRECTORYなど。

それぞれのターゲット プロパティを設定することもできます。

于 2012-10-09T14:16:19.717 に答える