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 回答