Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/fortran/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
更改cmake目录_Cmake_Fortran - Fatal编程技术网

更改cmake目录

更改cmake目录,cmake,fortran,Cmake,Fortran,我正在为一个具有以下结构的项目编写一个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(p

我正在为一个具有以下结构的项目编写一个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
文件夹),但还没有解决如何执行此操作

关于这一问题的一些答案是,你必须在每个文件夹中都有一个CMakeLists.txt文件——这是正确的吗?是否可以设置环境变量或使用CMake变量(例如)。从一些答案中也不十分清楚,他们发布的解决方案是否是C++特定的(因为这是最常用的语言CKEDE)。 编辑

我发现我可以通过稍微修改它来将其更改为我想要的行为:

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})

默认情况下,二进制文件将出现在构建目录的相应子目录中。我指的是包含
CMakeLists.txt
add\u executable()
call的目录

例如,如果您有以下
CMakeLists.txt

add_executable(tgt1 src1.f90)
add_executable(tgt2 subdir/src2.f90)
在根文件夹中,您将在
${CMAKE\u BINARY\u DIR}
中获得这两个二进制文件。因此,如果您希望
tgt2
位于
${CMAKE_BINARY_DIR}/subdir
,您需要在那里添加CMakeLists.txt并从那里调用
add_executable(tgt2 src2.f90)

您可以更改此行为:


您也可以设置。

谢谢您的提示;虽然我的经验似乎略有不同-二进制文件的创建级别比我的
CMakeLists.txt
文件低2级(
CMakeLists.txt
root/
中,二进制文件是在
root/src/code
中创建的)-我有什么误解吗?此外,如何找出当前设置为
CMAKE\u RUNTIME\u OUTPUT\u目录的内容?我在码头上找不到,真奇怪。它可能是Fortran特有的东西。您能发布实际的
CMakeLists.txt
?即使是在源代码构建中,这也是非常奇怪的行为。不知道顺便说一句,用于显示所需信息(状态为“blabla”)
和获取目标属性-
get_target_property()
命令。注意“bin”dir的想法。这不是现代建筑的工作方式,有充分的理由。你可能想要“源代码外构建”,请看这里:@Offirmo-hmm,我使用的所有科学软件似乎都有
src
bin
dir结构-这有什么不对?你能给我指出更多的阅读资料吗?例如,如果你想用不同的编译器(我这样做)或不同的选项(我也这样做)构建同一个程序,你会如何使它们在bin目录中共存?你必须复制整个结构。使用“源代码外”构建,您可以拥有任意多个“bin”dir,所有dir共享相同的源代码。cmake提倡它:例如,Wt库的构建方式如下:。