Como faço para transformar o CMake em um diretório 'bin'?


187

Atualmente, estou construindo um projeto com uma estrutura de plugins. Estou usando o CMake para compilar o projeto. Os plugins são compilados em diretórios separados. Meu problema é que o CMake compila e salva os binários e plugins, bibliotecas dinâmicas, na estrutura de diretórios da fonte. Como faço para o CMake salvar os arquivos em algo como um diretório ./bin ?

Respostas:


301

Como na resposta de Oleg, acredito que a variável correta a ser definida é CMAKE_RUNTIME_OUTPUT_DIRECTORY . Usamos o seguinte em nossa raiz CMakeLists.txt:

set(CMAKE_ARCHIVE_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/lib)
set(CMAKE_LIBRARY_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/lib)
set(CMAKE_RUNTIME_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/bin)

Você também pode especificar os diretórios de saída por destino:

set_target_properties( targets...
    PROPERTIES
    ARCHIVE_OUTPUT_DIRECTORY "${CMAKE_BINARY_DIR}/lib"
    LIBRARY_OUTPUT_DIRECTORY "${CMAKE_BINARY_DIR}/lib"
    RUNTIME_OUTPUT_DIRECTORY "${CMAKE_BINARY_DIR}/bin"
)

Em ambos os casos, você pode acrescentar _[CONFIG]ao nome da variável / propriedade para fazer o diretório de saída aplicam-se a uma configuração específica (os valores padrão para a configuração são DEBUG, RELEASE, MINSIZERELe RELWITHDEBINFO).


8
Você também pode substituir isso em uma base por destino, definindo a propriedade de destino RUNTIME_OUTPUT_DIRECTORY. Veja a documentação aqui: cmake.org/cmake/help/…
DLRdave 7/11/11

4
O link do DLRdave está morto. Tente cmake.org/cmake/help/v2.8.8/…
Nicu Stiurca

Como aplicá-lo a todas as configurações de uma só vez?
emlai

Os três primeiros comandos devem ser aplicados a todas as configurações (definindo especificamente CMAKE_RUNTIME_OUTPUT_DIRECTORY). Você configuraria apenas CMAKE_RUNTIME_OUTPUT_DIRECTORY_DEBUG (por exemplo) se desejasse um diretório diferente para a saída de depuração. O comportamento exato depende do gerador / cadeia de ferramentas que você está usando (por exemplo, os arquivos de projeto do Visual Studio incluem todas as configurações em uma árvore de compilação, enquanto o gerador de makefile gera apenas makefiles para uma configuração de compilação).
Adam Bowen

1
Qual é o objetivo da configuração CMAKE_ARCHIVE_OUTPUT_DIRECTORY, considerando que o comando install(TARGETS <target_name>)ainda reclama sobre "não foi fornecido DESTINO RUNTIME para destino executável"? Esta variável supostamente fornece um valor padrão; portanto, o installcomando não deve reclamar da ausência de a RUNTIME DESTINATION.
precisa saber é o seguinte

30

Usar set(CMAKE_RUNTIME_OUTPUT_DIRECTORY "/some/full/path/to/bin")


10
Use o nome do caminho completo para o diretório como o valor da variável e não coloque "/" à direita no valor ... como na resposta de Adam Bowen.
precisa saber é o seguinte

4
Por que você precisa adicionar o caminho completo? Parece que um aborrecimento quando você mover seu projeto ...
ScottF

8

Use a EXECUTABLE_OUTPUT_PATHvariável CMake para definir o caminho necessário. Para detalhes, consulte a documentação online do CMake:

Documentação do CMake 2.8.8


15
EXECUTABLE_OUTPUT_PATH ainda funciona no momento, mas é a maneira "antiga" de alcançar esse resultado. A resposta de Adam Bowen é a abordagem recomendada.
precisa saber é o seguinte

4

Quanto a mim, estou usando o cmake 3.5, o abaixo ( set variable) não funciona:

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/"
)

mas isso funciona ( 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/"
)

2
Eu estou usando a resposta de Adão com set (CMAKE _... e ele funciona, mas só quando você fazê-lo antes bibliotecas acrescentando, executáveis etc. Eu acho que é uma nota importante para iniciantes como eu.
ashrasmun

Uau. @ashrasmun me salvou de ficar louco depois de algumas horas. Absolutamente nada estava funcionando até chegar à conclusão de que a ordem desses comandos é muito relevante.
Artrópode

2
$ cat CMakeLists.txt
project (hello)
set(EXECUTABLE_OUTPUT_PATH "bin")
add_executable (hello hello.c)

1

Inglês não é minha língua nativa; desculpe erros de digitação.

use esta linha config:
set(EXECUTABLE_OUTPUT_PATH ${PROJECT_SOURCE_DIR}/build/)
coloque qualquer projeto CMakeLists.txt.
este $ {PROJECT_SOURCE_DIR} é o seu diretório de origem atual onde o local do projeto.
e se vagar por que $ {EXECUTABLE_OUTPUT_PATH}
verifique este arquivo CMakeCache.txte pesquise a palavra-chave output path,
todas as variáveis ​​definidas aqui, daria uma explicação completa do projeto setting·


0
cat CMakeLists.txt
project (hello)
set(CMAKE_BINARY_DIR "/bin")
set(EXECUTABLE_OUTPUT_PATH ${CMAKE_BINARY_DIR})
add_executable (hello hello.c)

8
Você poderia adicionar alguma explicação à sua resposta?
Paul Floyd

0

Independentemente de eu definir isso no CMakeLists.txt principal ou no individual, ele ainda pressupõe que eu quero todas as bibliotecas e caixas fora do caminho principal, que é a suposição menos útil de todas.


0

Para adicionar isso:

Se você estiver usando o CMAKE para gerar uma solução do Visual Studio e desejar que o Visual Studio produza arquivos compilados em / bin, a resposta de Peter precisará ser um pouco modificada:

# set output directories for all builds (Debug, Release, etc.)
foreach( OUTPUTCONFIG ${CMAKE_CONFIGURATION_TYPES} )
    string( TOUPPER ${OUTPUTCONFIG} OUTPUTCONFIG )
    set( CMAKE_ARCHIVE_OUTPUT_DIRECTORY_${OUTPUTCONFIG} ${CMAKE_SOURCE_DIR}/lib )
    set( CMAKE_LIBRARY_OUTPUT_DIRECTORY_${OUTPUTCONFIG} ${CMAKE_SOURCE_DIR}/lib )
    set( CMAKE_RUNTIME_OUTPUT_DIRECTORY_${OUTPUTCONFIG} ${CMAKE_SOURCE_DIR}/bin )
endforeach( OUTPUTCONFIG CMAKE_CONFIGURATION_TYPES )
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.