我正在为具有以下结构的项目编写一个 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})