2014-11-07 16 views
5

W Ubuntu pobrałem bibliotekę współdzieloną innej firmy, mylibrary.so, którą umieściłem w katalogu /home/karnivaurus/Libraries. Umieściłem również powiązany plik nagłówka, myheader.h, w katalogu /home/karnivaurus/Headers. Teraz chcę połączyć się z tą biblioteką w moim kodzie C++, używając cmake. Oto mój plik CMakeLists.txt:Błąd "Brak reguły, aby cel" w cmake podczas łączenia z biblioteką współdzieloną

cmake_minimum_required(VERSION 2.0.0) 

project(DemoProject) 

include_directories(/home/karnivaurus/Headers) 

add_executable(demo demo.cpp) 

target_link_libraries(demo /home/karnivaurus/Libraries/mylibrary) 

Jednak to daje mi komunikat o błędzie:

:-1: error: No rule to make target `/home/karnivaurus/Libraries/mylibrary', needed by `demo'. Stop. 

Co się dzieje?

+5

1. Czy naprawdę trzeba wspierać CMake jako starożytny ** ** jak 2,0? 2. Czy nazwa biblioteki na dysku nie powinna być "libmylibrary.so"? Jeśli tak nie jest, możesz spróbować dodać rozszerzenie '.so' do' target_link_libraries() ', może to pomóc w jego niezabezpieczeniu. – Angew

+0

Jeśli dodaję rozszerzenie '.so', to wtedy pojawia się błąd:' nie można znaleźć -lmylibrary' – Karnivaurus

+0

Czy można ręcznie połączyć z biblioteką, tj. W projekcie nie używającym CMake? Jeśli tak, to co osiąga linia poleceń? Może być możliwe wywnioskowanie z tego składni CMake. Nadal uważam, że nazwa biblioteki nie jest zgodna z konwencjami Linuksa. – Angew

Odpowiedz

0

Możesz użyć pełnej ścieżki do biblioteki statycznej. Aby połączyć w/dynamiczny, lepiej użyć link_directories() takiego:

cmake_minimum_required(VERSION 2.0.0) 

project(DemoProject) 

include_directories(/home/karnivaurus/Headers) 
link_directories(/home/karnivaurus/Libraries) 

add_executable(demo demo.cpp) 

target_link_libraries(demo mylibrary) 

i upewnij mylibrary ma prefiks i sufiks .solib w nazwie pliku (to pełna nazwa to /home/karnivaurus/Libraries/libmylibrary.so).

Aby dokonać projekcji bardziej elastyczny, lepiej napisać finder module i uniknąć ścieżki hardcode jak /home/karnivaurus/*

+1

Zamiast tego użyj find_file i przyjaciół. – steveire

+0

@steveire często tylko o ścieżce do pliku nie wystarcza. w przypadku poważniejszych projektów lepiej nauczyć się poszukiwaczy i jak je pisać. – zaufi

+0

To nie jest Twoja sugestia. – steveire

Powiązane problemy