我目前正在构建一个带有插件结构的项目。我正在使用CMake编译项目。这些插件在单独的目录中编译。我的问题是,CMake编译和保存二进制文件和插件,动态库,在源代码的目录结构。我如何让CMake保存文件在一个类似。/bin目录?


当前回答

对serg06的答案的进一步细化:

要强制所有生成器和所有构建配置都使用这三个路径,您可以添加一个空生成器表达式,如下所示:

set(CMAKE_RUNTIME_OUTPUT_DIRECTORY "$<0:>${CMAKE_BINARY_DIR}/bin") # .exe and .dll
set(CMAKE_LIBRARY_OUTPUT_DIRECTORY "$<0:>${CMAKE_BINARY_DIR}/lib") # .so and .dylib
set(CMAKE_ARCHIVE_OUTPUT_DIRECTORY "$<0:>${CMAKE_BINARY_DIR}/lib") # .lib and .a

这样做的副作用是迫使Visual Studio生成器使用指定的路径,而不是添加特定于配置的子目录,这样就不需要foreach循环。

其他回答

对serg06的答案的进一步细化:

要强制所有生成器和所有构建配置都使用这三个路径,您可以添加一个空生成器表达式,如下所示:

set(CMAKE_RUNTIME_OUTPUT_DIRECTORY "$<0:>${CMAKE_BINARY_DIR}/bin") # .exe and .dll
set(CMAKE_LIBRARY_OUTPUT_DIRECTORY "$<0:>${CMAKE_BINARY_DIR}/lib") # .so and .dylib
set(CMAKE_ARCHIVE_OUTPUT_DIRECTORY "$<0:>${CMAKE_BINARY_DIR}/lib") # .lib and .a

这样做的副作用是迫使Visual Studio生成器使用指定的路径,而不是添加特定于配置的子目录,这样就不需要foreach循环。

对于我来说,我使用的是cmake 3.5,下面(设置变量)不起作用:

set(
      ARCHIVE_OUTPUT_DIRECTORY "/home/xy/cmake_practice/lib/"
      LIBRARY_OUTPUT_DIRECTORY "/home/xy/cmake_practice/lib/"
      RUNTIME_OUTPUT_DIRECTORY "/home/xy/cmake_practice/bin/"
)

但这是有效的(set set_target_properties):

set_target_properties(demo5
    PROPERTIES
    ARCHIVE_OUTPUT_DIRECTORY "/home/xy/cmake_practice/lib/"
    LIBRARY_OUTPUT_DIRECTORY "/home/xy/cmake_practice/lib/"
    RUNTIME_OUTPUT_DIRECTORY "/home/xy/cmake_practice/bin/"
)
$ cat CMakeLists.txt
project (hello)
set(EXECUTABLE_OUTPUT_PATH "bin")
add_executable (hello hello.c)

使用EXECUTABLE_OUTPUT_PATH CMake变量设置所需的路径。详细信息请参考CMake在线文档:

CMake 2.8.8文档

使用set(CMAKE_RUNTIME_OUTPUT_DIRECTORY "/some/full/path/to/bin")