Сейчас я строю C ++ проект с помощью CMake. Я считаю, что CMake внесет ненужную библиотечную зависимость в проект. Возьмите пример, мой проект состоит из четырех частей: 1) lib1 2) lib2 3) lib3 и 4) app:
------lib1---
|----
lib2---
|----
lib3---
|----
app---
Исходный код в app
создаст программу, которая опирается на динамическую библиотеку, созданную в lib3
, lib3
однако, опирается на динамическую библиотеку, созданную в lib2
и так далее. Я создаю следующие сценарии CMake для создания проекта VC10:
1) Корневые CMakeLists:
cmake_minimum_required( VERSION 2.6 )
project (test)add_subdirectory(lib1)
add_subdirectory(lib2)
add_subdirectory(lib3)
add_subdirectory(app)
2) lib1 CMakeLists.txt
add_definitions (-DEXP_STL )
add_library(lib1 SHARED lib1.cxx)
3) lib3 CMakeLists.txt
add_definitions (-DEXP_STL )
add_library(lib3 SHARED lib3.cxx)
target_link_libraries(lib3 lib2)
4) приложение CMakeLists.txt
add_executable(app main.cpp)
target_link_libraries(app lib3)
С этими сценариями CMake у меня нет проблем при создании проекта VC10. Тем не менее, я заметил, что CMake представит ненужную библиотечную зависимость между библиотеками для VC10. Например, для app
прикладная программа, она опирается только на одну библиотеку, то есть lib3
, Однако, в проекте VC10 я заметил, что он добавил следующие дополнительные зависимости:
..\lib3\Debug\lib3.lib
..\lib2\Debug\lib2.lib
..\lib1\Debug\lib1.lib
В скрипте CMake, однако, только lib3
зависимость должна быть введена. Для нашего примера проекта это может не быть проблемой, но в других случаях введенные избыточные библиотеки могут привести к ошибкам компиляции, поскольку они требуют правильных путей поиска. Поэтому мне интересно, есть ли способ устранить эти ненужные библиотеки. Спасибо!
CMake транзитивно добавляет в зависимые библиотеки, которые можно отключить, установив для свойства LINK_INTERFACE_LIBRARIES пустую строку. Если вы делаете
SET_TARGET_PROPERTIES (lib3 PROPERTIES LINK_INTERFACE_LIBRARIES «»)
тогда CMake не будет генерировать зависимость от приложения к lib1 и lib2 при связывании приложения.
Если бы вы создавали статические библиотеки, я бы согласился с тем, что CMake использует ненужные зависимости. Однако вы создаете динамические библиотеки, и я не верю, что CMake добавляет сюда ненужные зависимости. У вас есть цепочка динамических библиотек. В этом случае, если вы ссылаетесь в lib3
, компоновщик также должен тянуть в lib2
, что затем заставит компоновщик втянуть lib1
чтобы удовлетворить все символьные зависимости для связи вашего приложения.