2015-11-13 3 views
1

я иметь следующую структуру проектов/источник:CMake add_subdirectory с find_package?

MyProject 
|-MyProject 
| |-src 
| | |-project.c 
| | 
| |-CMakeLists.txt 
| 
|-MyLibrary 
    |-include 
    | |-hello.h 
    | 
    |-src 
    | |-hello.c 
    | 
    |-CMakeLists.txt 

MyProject/src/project.c включает MyLibrary/include/hello.h, который в свою очередь включает в себя libusb.h из системы (найденной с помощью CMake).

И я добавляю зависимость libusb в MyLibrary/CMakeLists.txt, используя следующий код:

# Find libusb 
find_package(LibUsb REQUIRED) 

# Include libusb 
include_directories(${LIBUSB_INCLUDE_DIR}) 

# Add dependencies 
target_link_libraries(owi535 ${LIBUSB_LIBRARY}) 

Однако при составлении MyProject (который включает в себя MyLibrary с использованием add_subdirectory и target_link_libraries), я получаю сообщение об ошибке с указанием libusb.h не может быть найден.

Я могу скомпилировать MyLibrary самостоятельно, однако для компиляции MyProject требуется libusb.h, чтобы быть в нем включен путь, которого нет.

Есть ли способ сделать это, добавив MyLibrary в качестве зависимости, MyProject тянет libusb.h через него? Это означало бы, что мне не нужно повторять код find_package для каждого проекта, который включает MyLibrary.


Другой вопрос, который у меня есть, подобен; Я получаю сообщение о том, что есть Undefined symbols при вызове функций libusb в MyLibrary при компиляции MyProject, однако при компиляции MyLibrary на свой счет ошибок нет.

Undefined symbols for architecture x86_64: 
    "_libusb_close", referenced from: 
     _my_close_method in libMyLibrary.a(hello.c.o) 
    "_libusb_exit", referenced from: 
     _my_exit_method in libMyLibrary.a(hello.c.o) 
    "_libusb_init", referenced from: 
     _my_init_method in libMyLibrary.a(hello.c.o) 
    "_libusb_open_device_with_vid_pid", referenced from: 
     _my_open_method in libMyLibrary.a(hello.c.o) 
ld: symbol(s) not found for architecture x86_64 

ответ

1

Из cmake documentation:

PUBLIC и INTERFACE элементов заполнят INTERFACE_INCLUDE_DIRECTORIES свойства < мишени>.

Цели могут заполнить это свойство [INTERFACE_INCLUDE_DIRECTORIES], чтобы опубликовать каталоги include, необходимые для компиляции против заголовков для цели. Потребительские цели могут добавлять записи к собственному свойству INCLUDE_DIRECTORIES, например $<TARGET_PROPERTY:foo,INTERFACE_INCLUDE_DIRECTORIES>, чтобы использовать каталоги include, указанные в интерфейсе foo.

Таким образом, вы должны использовать это в MyLibrary/CMakeLists.txt:

target_include_directories(MyLibrary PUBLIC ${LIBUSB_INCLUDE_DIR}) 
+0

У меня та же проблема с связывая фактическую библиотеку. Получение «Неопределенных символов», относящихся к libusb при компиляции 'MyProject', но' MyLibrary' компилируется отлично. Есть ли подобное исправление? –

+0

Это отдельная проблема. Вы можете повторить этот ответ и открыть новый вопрос с новой проблемой. –

+0

Но чтобы ответить на ваш вопрос, похоже, что вы на самом деле не связываете библиотеку libusb в MyLibrary правильно. Это не будет ошибкой при компиляции MyLibrary напрямую, так как кажется, что вы используете статическое связывание. –

Смежные вопросы