2010-02-05 12 views
39

Así que tengo una biblioteca que estoy compilando y necesito vincular elementos de terceros diferentes según si se trata de la versión de depuración o liberación (específicamente las versiones de versión o depuración de esas bibliotecas). ¿Hay alguna manera fácil de hacer esto en Cmake?Vinculación de diferentes bibliotecas para compilaciones de depuración y liberación en Cmake en Windows?

Edit: debe tener en cuenta que estoy usando Visual Studio

Respuesta

70

De acuerdo con la CMake documentation:

target_link_libraries(<target> [lib1 [lib2 [...]]] [[debug|optimized|general] <lib>] ...) 

una "depuración", "optimizado", o "general" palabra clave indica que la biblioteca que sigue inmediatamente se debe usar solo para la configuración correspondiente de compilación .

Por lo que debe ser capaz de hacer esto:

add_executable(MyEXE ${SOURCES}) 

target_link_libraries(MyEXE debug 3PDebugLib) 
target_link_libraries(MyEXE optimized 3PReleaseLib) 
+12

Lo hago todo el tiempo, incluso de forma más compacta en una línea: target_link_libraries (MyEXE depuración 3PDebugLib optimizado 3PReleaseLib) –

+8

¿Y si el nombre de la biblioteca es la misma, pero que quieren estudio visual para buscar que en un camino diferente ? es decir, quiero vincular mylib.lib, pero tengo dos versiones compiladas. una en /path/Debug/mylib.lib y otra en /path/Release/mylib.lib (como suele ser el caso con algunas bibliotecas). ¿Que haces entonces? – Jubei

+1

@Jubei Defina 2 variables. Uno para cada biblioteca. – Qsiris

4

De alguna manera la respuesta de @ Mike Willekes consiguió CMake que une en el mismo objetivo tanto la liberación y depurar para mí :(

Esto solo funcionaba estableciendo ambas configuraciones en una línea, como lo sugirió @sakra in a related question, y lo hago para cada biblioteca que haya que vincular:

target_link_libraries (app 
    debug ${Boost_FILESYSTEM_LIBRARY_DEBUG} 
    optimized ${Boost_FILESYSTEM_LIBRARY_RELEASE}) 

target_link_libraries (app 
    debug ${Boost_LOG_LIBRARY_DEBUG} 
    optimized ${Boost_LOG_LIBRARY_RELEASE}) 

target_link_libraries (app 
    debug ${Boost_PROGRAM_OPTIONS_LIBRARY_DEBUG} 
    optimized ${Boost_PROGRAM_OPTIONS_LIBRARY_RELEASE}) 

# ... 
+0

¡Ah, esto es lo que me estaba sucediendo! Solo queremos vincular una biblioteca en particular en el modo de lanzamiento, por lo que su método no funcionó. Al final trabajé alrededor de ella mediante el uso de algo como lo siguiente: 'Si (CMAKE_BUILD_TYPE STREQUAL "Release") \t target_link_libraries ($ {ARG_NAME} \t \t \t $ {LIB_TCMALLOC} \t \t) \t endif()' –

+0

El inconveniente, @SteveLorimer, es que en los generadores de configuraciones múltiples, como en el caso de Visual Studio, esto no funcionaría como se hace en tiempo de generación. – Tarc

+0

no estoy seguro de entender? No vinculamos tcmalloc en compilaciones de depuración. Vinculamos tcmalloc en compilaciones de lanzamiento. Es decir, no hay una versión de depuración de tcmalloc, por lo que enumerarla en optimizado solo da como resultado que se vincule también en compilaciones de depuración –

Cuestiones relacionadas