Understanding LIBRARY_OUTPUT_DIRECTORY_CONFIG in CMake


CMake is a cross-platform build system software that generates platform-specific build files for various compilers. It uses text files called CMakeLists.txt to define the project structure, dependencies, and build configuration.

Properties in CMake are settings that control how targets are built. Targets are the executable or library files created by your project. There are different types of properties that can be set for targets, including:

  • LINK_FLAGS - Specifies linker flags to use for the target.
  • COMPILE_FLAGS - Specifies compiler flags to use for the target.
  • INCLUDE_SYSTEM_DIRECTORIES - Specifies directories to search for system header files.
  • INCLUDE_DIRECTORIES - Specifies directories to search for header files.
  • SOURCE - Specifies the source files for a target.

LIBRARY_OUTPUT_DIRECTORY is likely a custom property that specifies the directory where libraries generated during the build process will be placed. This property might be set for a specific target that creates a library.

Imagine you have a target named myLibrary that creates a library file. You might set the LIBRARY_OUTPUT_DIRECTORY property for this target to a directory named lib within your project directory. This would tell CMake to place the generated myLibrary.so or myLibrary.lib file (depending on the platform) inside the lib directory.

  • This property is likely set for a specific target that creates a library.
  • It specifies the directory where libraries are placed during the build process.
  • "LIBRARY_OUTPUT_DIRECTORY_CONFIG" is likely a custom property in CMake.


# Define a custom property for the output directory of libraries
set(LIBRARY_OUTPUT_DIRECTORY "${CMAKE_BINARY_DIR}/lib")

# Create a target named "myLibrary" that creates a library
add_library(myLibrary SHARED source1.cpp source2.cpp)

# Set the custom property for the target
set_target_properties(myLibrary PROPERTIES LIBRARY_OUTPUT_DIRECTORY "${LIBRARY_OUTPUT_DIRECTORY}")

In this example:

  • We use set_target_properties to set the LIBRARY_OUTPUT_DIRECTORY property for the myLibrary target.
  • We create a target named myLibrary that creates a shared library.
  • We define a custom property named LIBRARY_OUTPUT_DIRECTORY and set its value to ${CMAKE_BINARY_DIR}/lib. This places libraries in a lib directory within the build directory.

This way, when you build the project, the generated library file (e.g., myLibrary.so on Linux) will be placed in the ${CMAKE_BINARY_DIR}/lib directory.



  1. Using LIBRARY_OUTPUT_DIRECTORY
add_library(myLibrary SHARED source1.cpp source2.cpp)
set_target_properties(myLibrary PROPERTIES LIBRARY_OUTPUT_DIRECTORY "${CMAKE_BINARY_DIR}/lib")

This code achieves the same result as the custom property example, but uses the standard mechanism.

  1. Using CMAKE_LIBRARY_OUTPUT_DIRECTORY

This is a CMake variable that specifies the default directory for all library targets. You can set this variable before creating your targets:

set(CMAKE_LIBRARY_OUTPUT_DIRECTORY "${CMAKE_BINARY_DIR}/lib")

add_library(myLibrary SHARED source1.cpp source2.cpp)

This approach sets the default library output directory for all targets created afterwards.

  1. Using per-configuration output directories (for multi-configuration generators)

For generators like Visual Studio or Xcode, you can set a configuration-specific output directory using LIBRARY_OUTPUT_DIRECTORY_<CONFIG>. This allows you to have different output locations for different build configurations (e.g., Debug vs. Release).

set_target_properties(myLibrary PROPERTIES LIBRARY_OUTPUT_DIRECTORY_DEBUG "${CMAKE_BINARY_DIR}/lib/debug")
set_target_properties(myLibrary PROPERTIES LIBRARY_OUTPUT_DIRECTORY_RELEASE "${CMAKE_LIBRARY_OUTPUT_DIRECTORY}/lib/release")
  • If you need different output directories based on build configuration (for multi-configuration generators), use LIBRARY_OUTPUT_DIRECTORY_<CONFIG>.
  • If you want to set a default directory for all libraries in your project, use CMAKE_LIBRARY_OUTPUT_DIRECTORY.
  • If you only need to specify the output directory for a single target, use set_target_properties with LIBRARY_OUTPUT_DIRECTORY.