CMake'ye kaynak dizindeki statik bir kitaplığa bağlanmasını nasıl söylerim?


96

Çoğunlukla sadece CMake ile deneyim kazanmak için CMake'ye dönüştürmeye çalıştığım bir Makefile ile küçük bir projem var. Bu örneğin amaçları doğrultusunda, proje bir kaynak dosyası (C ++, ancak dilin özellikle alakalı olduğunu düşünmüyorum) ve başka bir yerden kopyaladığım statik bir kitaplık dosyası içeriyor. Argüman uğruna kitaplığın kaynak kodunun mevcut olmadığını varsayın; Yalnızca .a dosyasına ve ilgili başlığa sahibim.

El yapımı Makefile dosyam şu derleme kuralını içeriyor:

main: main.o libbingitup.a
    g++ -o main main.o libbingitup.a

hangisi iyi çalışıyor. CMake'ye bunu yeniden üretmesini nasıl söylerim? Elbette tam olarak bu makefile değil, eşdeğer bir bağlama komutu içeren bir şey. Bariz ama saf yolları denedim, mesela

add_executable(main main.cpp libbingitup.a)

veya

add_executable(main main.cpp)
target_link_libraries(main libbingitup.a)

yanı sıra link_directories(.)veya add_library(bingitup STATIC IMPORTED)vb. ile çeşitli şeyler, ancak şimdiye kadar hiçbir şey başarılı bir bağlantıyla sonuçlanmadı. Ne yapmalıyım


Sürüm ayrıntıları: GCC 4.6.3 ile Linux (Kubuntu 12.04) üzerinde CMake 2.8.7

Yanıtlar:


121

CMake, kitaplıkları bağlamak için tam yolu geçmeyi tercih eder, bu nedenle libbingitup.a'nın içinde olduğunu varsayarsak ${CMAKE_SOURCE_DIR}, aşağıdakileri yapmak başarılı olmalıdır:

add_executable(main main.cpp)
target_link_libraries(main ${CMAKE_SOURCE_DIR}/libbingitup.a)

2
Harika, işe yarıyor, teşekkürler! Burada açıkça tam yolu koymak zorunda olmak biraz zor görünüyor, ama sanırım bu sadece CMake yolu ...
David Z

4
Burada aşırılık gibi göründüğüne katılıyorum, ancak aynı kütüphanenin birden fazla farklı sürümüne sahipseniz, tam yolu açıkça belirtmek size fayda sağlar.
Fraser

1
Her zamanki gibi harika! Benim durumumda, bir statik kitaplığa bağlı olan başka bir yerleşik dinamik kitaplığa bağlı olarak bir kitaplık sorunu çözüldü: bağlı kitaplıklar da bu statik kitaplığa bağlanmaya çalışıyordu.
Antonio

1
Main, içerme dizinlerini nasıl bilir?
ManuelSchneid3r

3
Sen kullanmanız gerekir target_include_directoriesveya include_directories(daha spesifik olduğu gibi eski tercih edilen yoldur).
Fraser

31

Tam yolu dahil etmek istemiyorsanız, şunları yapabilirsiniz:

add_executable(main main.cpp)
target_link_libraries(main bingitup)

bingitup CMake projesinde statik kitaplığı oluşturursanız hedef vereceğiniz adın aynısıdır:

add_library(bingitup STATIC bingitup.cpp)

CMake , Linux'ta ve sonunda Windows'da otomatik olarak liböne ve .asona ekler .lib.

Kitaplık harici ise, yolu kitaplığa eklemek isteyebilirsiniz.

link_directories(/path/to/libraries/)

1
Ve eğer aynı ada sahip .a ve .so dosyaları varsa, bu durumda .a veya .so ile bağlantı kurmak istediğinizi nasıl belirtirsiniz?
George

1
@George: Yapamazsın. Her iki türün de mevcutsa, bağlantı kurmak istediğiniz dosyanın tam adını ekleyin.
Cris Luengo 18-19

21

Bunu yararlı buldum ...

http://www.cmake.org/pipermail/cmake/2011-June/045222.html

Örneklerinden:

ADD_LIBRARY(boost_unit_test_framework STATIC IMPORTED)
SET_TARGET_PROPERTIES(boost_unit_test_framework PROPERTIES IMPORTED_LOCATION /usr/lib/libboost_unit_test_framework.a)
TARGET_LINK_LIBRARIES(mytarget A boost_unit_test_framework C)

3
INCLUDE_DIRECTORIES ne olacak?
kyb

1
Bu sadece kütüphane cmake yapısının bir parçasıysa işe yarar, ancak yabancılar bu işe yaramaz
eigenfield

soru "proje bir kaynak dosyası (C ++, ancak dilin özellikle alakalı olduğunu düşünmüyorum) ve başka yerden kopyaladığım statik bir kitaplık dosyası içeriyor" diyor.
stu
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.