2010-09-20 8 views
17

Próbuję zbudować projekt oparty na OpenCV przy użyciu CMake, działającego pod Linuksem. Do tej pory moje CMakeLists.txt pliki wyglądałJak mam powiedzieć cmake, że mój projekt ma połączyć statycznie biblioteki?

FIND_PACKAGE (OpenCV REQUIRED) 
... 
TARGET_LINK_LIBRARIES (my-executable ${OpenCV_LIBS}) 

ale skutkuje to dynamicznie połączonych bibliotek. Jak mogę połączyć się z bibliotekami statycznymi?

+0

Jak wskazuje się "CMake przy statycznej konstrukcji OpenCV"? Moja kompilacja ma zarówno statyczne, jak i udostępnione biblioteki. –

+0

zobacz odpowiedź poniżej: http://stackoverflow.com/a/10709424/6069 – agnul

Odpowiedz

9

Budujesz statyczne biblioteki OpenCV ustawiając po prostu flagę BUILD_SHARED_LIBS na wartość false w CMake. Wtedy wszystko, co trzeba zrobić, aby zbudować własną aplikację z tych bibliotek statycznych jest dodanie zależność OpenCV w swojej CMakeLists.txt:

FIND_PACKAGE (OpenCV REQUIRED) 
... 
TARGET_LINK_LIBRARIES (your-application ${OpenCV_LIBS}) 

i CUpewnij zadba o wszystko.

+0

To 'BUILD_SHARED_LIBS', a nie' _LIBRARIES'. :-) – Ela782

+0

Poprawiłem BUILD_SHARED_LIBRARIES na BUILD_SHARED_LIBS. –

+0

Przynajmniej z CLion pod Windows (CLI 2016.3 EAP), który jest dostarczany w pakiecie z CMake 3.6.1, podczas budowania OpenCV 3.1.0, był to jedyny sposób wymienionych tutaj, co spowodowało, że CMake zbudował OpenCV jako statyczne zamiast współdzielone biblioteki. Należy zauważyć, że próby włączenia tej opcji poprzez edycję CMakeLists.txt nie powiodły się; tylko przez edycję cache CMake poprzez okno pamięci podręcznej CLION i kliknięcie ikony * Apply Changes and Reload Project * umożliwiło moim kombinacjom CLION/CMake zaakceptowanie 'BUILD_SHARED_LIBS'. Nie jestem pewien, czy jest to problem z CLION, który powinien być udokumentowany. –

8

Aby połączyć wszystko statycznie, uważam, że szukasz CMAKE_EXE_LINKER_FLAGS (dodaj -static).

Czy używasz "prostej metody" OpenCVConfig.cmake? lub starszy FindOpenCV.cmake?

1

w linii add_library określić statyczne. Zobacz http://www.cmake.org/cmake/help/cmake-2-8-docs.html#command:add_library

Correction ponieważ szukasz połączyć przeciwko biblioteka statyczna Chciałbym spojrzeć na własność CMAKE_FIND_LIBRARY_SUFFIXES

+0

Myślę, że polecenie add_library ma wygenerować plik binarny wyjściowy. W takim przypadku określenie STATIC powoduje wygenerowanie .a. – jkerian

+0

Statyczne słowo kluczowe dla add_library określa, jaki rodzaj biblioteki generuje, ale nie jest tak podczas generowania pliku binarnego. – RobertJMaynard

+0

Być może źle mnie zrozumiałem, ale myślałem, że OP próbuje połączyć się z biblioteką statyczną, a nie ją wygenerować. – jkerian

2

AFAIK to trochę skomplikowane, ponieważ CUpewnij dokładniej polecenie find_library, preferuje wspólne bibliotekami i wyszukuje te jeśli dostępne są zarówno wspólne, jak i statyczne.

Ciągle szukam dobrego rozwiązania, aby móc kompilować pliki binarne "tak statycznie jak to możliwe", ale nie znalazłem jeszcze eleganckiego rozwiązania. Jedynym sposobem, który na pewno zadziała, jest zaimplementowanie wszystkiego poprzez niestandardowe moduły FindXXXX.

+1

Jedynym sposobem teraz jest zmiana wyszukanych sufiksów biblioteki: 'zestaw (CMAKE_FIND_LIBRARY_SUFFIXES $ {CMAKE_STATIC_LIBRARY_SUFFIX})' przed 'find_library()'. FindBoost i ma specjalną opcję wymuszenia użycia bibliotek statycznych ('Boost_USE_STATIC_LIBS'), ale działa również wewnętrznie, zmieniając' CMAKE_FIND_LIBRARY_SUFFIXES'. – marcin

1

Zauważ, że gcc odmawia odwołuje jeśli przejdą opcję -static, ale trzeba dynamicznych bibliotekami w argumentach Link - który będzie jeśli po prostu użyć FindOpenCV.cmake a to podnosi dynamicznych bibliotekami (I nie wiem jak zachowuje się OpenCVConfig.cmake) ...

4

W rzeczywistości problem ten został już naprawiony w wersji OpenCVConfig.cmake dostarczanej z OpenCV. Wszystko, co musisz zrobić, to zdefiniować OpenCV_STATIC w swoim CMakeLists.txt. To znaczy.

set(OpenCV_STATIC ON) 
find_package(OpenCV REQUIRED) 
+0

Co robi "find_package (OpenCV REQUIRED)"? – James