我正在为具有以下结构的项目编写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})
答案 0 :(得分: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_DIRECTORY,CMAKE_RUNTIME_OUTPUT_DIRECTORY和其他人。
您也可以设置respective target properties。