2011-03-31 14 views
16

Zaten yardımcı olmadı bir Thread zaten vardı. Ben bunu nasıl elde edebilirsiniz, Yayın Config'de ve ayıklama Config için Foo_d.lib örneğin Foo.lib için bağlamak isterler? Eğer bunu yaparsam : o zamanHata ayıklama ve serbest bırakma kitaplığı CMAKE (VISUAL STUDIO) ile bağlantı oluşturma

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

Ben ayıklama yapılandırma için projemde hem kitaplıkları var? Neden Yayınlama seçeneği yok?

Çok teşekkürler!

cevap

25

çözümdür: kütüphane projeniz bir parçası ya da bunu find_package komutunun yapılandırma modunu kullanarak ithal olduğunuzda

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

Her zaman önceden hazırlanmış modüller için çözüm arıyorum. E.g .: FindQt4.cmake. – Naszta

+1

Birden çok hata ayıklama ve kitaplık sürümlerim varsa bu nasıl çalışır. Örneğin, _Foo1_d _, _ Foo2_d_ & _Foo1 _, _ Foo2_. Onları tek değişken altında nasıl kulüpleyebilirim? Şu anda yalnızca ilişkili ilk lib (anahtar hata ayıklama veya yayımlama) için anahtar kelimeleri algılayabilir ve bir sonraki için tanınmayan – user1036908

8

(documentation ve example bakınız) herhangi bir sorun yoktur.

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) 

not: <package>Config.cmake üretecek böylece Eğer cevap taklit böyle bir süreçtir (o cmake aracını kullanamaz veya bunu yapmak istemiyorum) 3. taraf değiştiremezsiniz "debug"/"optimize" özelliği böyle bir yaklaşım ayıklama/Yayın yapılandırmasında sınırlı değildir aksine o:

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

Eğer INTERFACE_INCLUDE_DIRECTORIES gibi bazı güzellikler var:

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 
bağlama

ve geçişli: Elbette

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 

bunları hardcoding yerine konumlarını tahmin etmek find_library ve find_package(... MODULE) gibi düzenli cmake komutları kullanabilirsiniz.

18

target_link_libraries bir liste alır, iki kez çağırmanıza gerek yoktur. Aşağıdaki çalışacaktır: Ayrıca parçası olarak kütüphane inşa ki

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

Not:

target_link_libraries(MyEXE debug Foo_d optimized Foo) 

Ve başka cevap yorumlarında sorulan bir soruya cevap vermek, çoklu kütüphaneler ile çalışan bu yüzden gibi çalışır CMake projesinin hata ayıklamasını belirtmeniz veya optimize etmeniz gerekmez. CMake sizin için doğru olanı seçecektir.

6

hata ayıklama olanlar _D gibi belirli bir düzenle izleyin ayıklama/bırakma kütüphanelerini varsa, birlikte kendini tekrar önleyebilirsiniz:

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} 
    ) 

Bu uygun

debug foo_d optimized foo 
debug bar_d optimized bar 

üretecektir target_link_libraries'un beklediği satırlar.

İlgili konular