2016-06-24 2 views
2

У меня есть проект, используя 3 CMakeLists.txt:CMake ненужной зависимость

  • CMakeLists.txt C моих исполняемый и зависит от
  • CMakeLists.txt B который является статическим Lib и зависит от
  • CMakeLists.txt A, который также является статической Lib и зависит от внешнего Lib

В CMakeLists.txt C уточняю мою зависимость от B с помощью использования target_link_libraries() и я делаю то же самое для зависимости от В против . В CMakeLists.txt A Я определяю зависимость от внешней библиотеки.

The CMakeLists.txt and dependencies

Я бы ожидать, что это работает, но C фактически жалуется на линии времени, и я могу только получить его на работу, указав зависимость в C против внешней Lib.

Обратите внимание, что внешняя библиотека является динамической (файл .so).

Это выглядит странно для меня, нет? Кто-нибудь понимает, что происходит?

Thanks,

Antoine.

ответ

1

Это должно сработать. Уверен, что в CMakeLists.txt есть ошибка.

Просмотр реальных зависимостей

Проверить его:

cmake .. --graphviz=deps.dot 
xdot deps.dot 

Он покажет красивую картину дерева зависимостей, который видит CMake.

Если у вас нет xdot, экспортировать его в формате PNG:

dot -Tpng deps.dot -o deps.png 
firefox deps.png 

библиотека не найдена?

Другая возможность заключается в том, что внешняя библиотека фактически не может быть найдена. Используйте find_library, а не просто положив имя библиотеки:

find_library(FAIL failingmadly) 
if (NOT FAIL) 
    message(FATAL_ERROR "Couldn't find the failingmadly library") 
endif() 
target_link_libraries(my_lib_a ${FAIL}) 

Позиция независимый код?

Другая возможность при связывании статических библиотек с зависимостями от общих библиотек - жалобы ПИК. Вы можете добавить это в cmake перед компиляцией чего-либо:

add_definitions(-fPIC) 

Удачи.

+0

Hi matiu, я попробую это, спасибо большое! – arennuit

+0

Привет, matiu, он действительно работал с find_library() (не знаю почему). Есть ли эквивалент find_library() для работы с каталогами include? Спасибо;) – arennuit

+0

не беспокоится :) - https://cmake.org/cmake/help/v3.4/command/find_path.html - также проверьте: https://cmake.org/Wiki/CMake:How_To_Find_Libraries – matiu

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