2011-03-31 22 views
16

Ya había un Thread que no ayudó realmente. Quiero ser capaz de enlazar por ejemplo Foo.lib para lanzamiento Config y Foo_d.lib para depuración Config, ¿cómo puedo lograr esto? Si hago esto:Biblioteca de depuración y liberación Vinculación con CMAKE (VISUAL STUDIO)

target_link_libraries(MyEXE debug Foo_d) 
target_link_libraries(MyEXE optimized Foo) 

entonces tengo dos bibliotecas en mi proyecto para la configuración de depuración? ¿Por qué no hay opción de Liberar?

Gracias mucho!

Respuesta

25

La solución es:

SET(LINK_LIBRARY optimized Foo debug Foo_d) 
target_link_libraries(MyEXE ${LINK_LIBRARY}) 
+0

Siempre estoy buscando soluciones en módulos prefabricados. Por ejemplo: en FindQt4.cmake. – Naszta

+1

cómo funcionará esto si tengo varias bibliotecas de depuración y liberación. Por ejemplo, tengo _Foo1_d _, _ Foo2_d_ & _Foo1 _, _ Foo2_. ¿Cómo puedo agruparlos en una sola variable? Actualmente solo puede detectar las palabras clave para la primera lib asociada (depuración o versión) y no reconoce para la siguiente – user1036908

8

no hay problemas cuando su biblioteca es una parte del proyecto o estás importarlo utilizando el modo de configuración de find_package de comandos (ver documentation y example). En caso de que no se puede modificar la tercera parte lo que producirá <package>Config.cmake (que cmake herramienta no podrá utilizar o no querer hacerlo) la respuesta es emular dicho proceso:

add_library(foo STATIC IMPORTED) 
set_target_properties(foo PROPERTIES IMPORTED_LOCATION_DEBUG "/path/to/foo-d.lib") 
set_target_properties(foo PROPERTIES IMPORTED_LOCATION_RELEASE "/path/to/foo.lib") 

target_link_libraries(MyEXE foo) 

nota que a diferencia de "depuración" "optimizado" característica de estos enfoques/no se limita a configuraciones de depuración/de la versión:

set_target_properties(foo PROPERTIES IMPORTED_LOCATION_MINSIZEREL "/path/to/foo-small.lib") 

también tienes un poco de golosinas como INTERFACE_INCLUDE_DIRECTORIES:

set_target_properties(foo PROPERTIES INTERFACE_INCLUDE_DIRECTORIES "/path/to/foo/includes") 

include_directories("/path/to/foo/includes") # this line not needed 
target_link_libraries(MyEXE foo) # this command will add "/path/to/foo/includes" for you 

y transitiva vinculación:

add_library(boo STATIC IMPORTED) 
set_target_properties(boo PROPERTIES IMPORTED_LOCATION_DEBUG "/path/to/boo-d.lib") 
set_target_properties(boo PROPERTIES IMPORTED_LOCATION_RELEASE "/path/to/boo.lib") 

add_library(foo STATIC IMPORTED) 
set_target_properties(foo PROPERTIES IMPORTED_LOCATION_DEBUG "/path/to/foo-d.lib") 
set_target_properties(foo PROPERTIES IMPORTED_LOCATION_RELEASE "/path/to/foo.lib") 

set_target_properties(foo PROPERTIES INTERFACE_LINK_LIBRARIES boo) # foo depends on boo 

target_link_libraries(MyEXE foo) # boo will be linked automatically 

Por supuesto se pueden utilizar comandos regulares cmake como find_library y find_package(... MODULE) para estimar ubicaciones en lugar de codificar ellos.

18

target_link_libraries toma una lista, no necesita llamarla dos veces. El siguiente trabajo:

target_link_libraries(MyEXE debug Foo_d optimized Foo) 

Y para responder a una pregunta formulada en los comentarios de otra respuesta, se trabaja con varias bibliotecas funciona de esta manera:

target_link_libraries(MyEXE 
    debug Foo1_d optimized Foo1 
    debug Foo2_d optimized Foo2) 

Tenga en cuenta que si también construir la biblioteca como parte del proyecto CMake, no necesita especificar depuración u optimización. CMake elegirá el más adecuado para usted.

6

Si tiene bibliotecas de depuración/liberación que siguen un patrón determinado, como _D en los depuración, puede evitar repetir siempre lo mismo con:

set (MY_LIBS 
    foo 
    bar 
    baz 
) 

# Generate the list of files to link, per flavor. 
set (LINK_LIST "") 
foreach(x ${MY_LIBS}) 
    list (APPEND LINK_LIST debug ${x}_d optimized ${x}) 
endforeach() 

target_link_libraries (mytarget 
    commonlib1 
    commonlib2 
    ${LINK_LIST} 
    ) 

Esto generará el apropiado

debug foo_d optimized foo 
debug bar_d optimized bar 

líneas que espera target_link_libraries.

Cuestiones relacionadas