Cmake распространяет зависимости с использованием find_packageC++

Программы на C++. Форум разработчиков
Ответить
Anonymous
 Cmake распространяет зависимости с использованием find_package

Сообщение Anonymous »

В качестве простого примера: есть две библиотеки и одна исполняемая форма. Один называется libmain , а один называется libutil . libmain использует libutil , так же как и исполняемый файл.
исполняемый файл может использовать libutil самостоятельно, но обычно он называет метод из libmain , который использует libutil в своей реализации.

Так что после прочтения некоторых учебных пособий и документов о Cmake Этот пример казался довольно простым.
Существует простой cmakelists.txt для каждого проекта, в то время как libutil ссылается на libmain и исполняемые ссылки с libmain . (I OMMITED TARGET_INCLUDE_DIRECTIORES < /code>, чтобы лишить некоторые строки). Тот же префикс_Пат используется всеми проектами. < /P>

libutil < /h1>

Код: Выделить всё

include(GNUInstallDirs)

project(libUtil)
set(CMAKE_SHARED_LIBRARY_PREFIX "")
add_library(libUtil SHARED main.cpp)
install(DIRECTORY include/ DESTINATION ${CMAKE_INSTALL_INCLUDEDIR})
install(TARGETS ${PROJECT_NAME} EXPORT ${PROJECT_NAME}Config
LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR})
install(EXPORT ${PROJECT_NAME}Config DESTINATION ${CMAKE_INSTALL_PREFIX}/cmake)
< /code>

 libmain < /h1>

include(GNUInstallDirs)

project(libMain)
set(CMAKE_SHARED_LIBRARY_PREFIX "")
add_library(libUtil SHARED main.cpp)
find_package(libUtil REQUIRED)
target_link_libraries(${PROJECT_NAME} PUBLIC libUtil)
install(DIRECTORY include/ DESTINATION ${CMAKE_INSTALL_INCLUDEDIR})
install(TARGETS ${PROJECT_NAME} EXPORT ${PROJECT_NAME}Config
LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR})
install(EXPORT ${PROJECT_NAME}Config DESTINATION ${CMAKE_INSTALL_PREFIX}/cmake)
< /code>

 исполняемая < /h1>

project(exe)
find_package(libMain REQUIRED)
set(CMAKE_SHARED_LIBRARY_PREFIX "")
add_executable(exe main.cpp)
target_link_libraries(${PROJECT_NAME} PRIVATE libMain)
< /code>

Однако при создании исполняемого файла я в итоге получил ошибку линкера, сообщил Exe  не в состоянии выполнить -llibitil < /strong>. < /p>

Я не трачу довольно много времени на это и после прочтения нескольких постов (или, по крайней мере, я так нужен), что мне нужно, чтобы дать  custom -ancile. Переименован сгенерированный на libmaintargets.cmake) < /p>

include("${CMAKE_CURRENT_LIST_DIR}/libMainTargets.cmake")

find_package(libUtil REQUIRED)
< /code>

Ошибка линкера исчезла сейчас, и я могу запустить свой проект. Тем не менее, я не понимаю, зачем мне это делать. Я понял, что есть разница при обработке уже построенной библиотеки. Однако, поскольку Cmake всегда использует разделение проектов на основе каталогов, как и зачем мне создавать несколько проектов в одном и том же cmakelists.txt? До сих пор я всегда использовал find_package 
(который Essentialy делает импортируется add_library, т. Е. Поиск библиотеки перед сборкой, если я не ошибаюсь) и хотел распространить свои определенные зависимости в проект «потребляющий». Но кажется, что все общедоступные , интерфейс и private из импортированной цели не влияют на цель «потребляющей»? < /p>

Пожалуйста, будьте подробно в объяснении и /или укажите некоторые ссылки, которые я пропустил, и указывайте на некоторые лучшие практики, предполагая, что все проекты либо создаются, либо являются системными библиотеками, такими как Boost или JNI. < /p>

Спасибо!>

Подробнее здесь: https://stackoverflow.com/questions/596 ... nd-package
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «C++»