Visual Studio 2010 — Как я могу уменьшить ненужные зависимости библиотеки C ++, представленные CMake?

Сейчас я строю 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 зависимость должна быть введена. Для нашего примера проекта это может не быть проблемой, но в других случаях введенные избыточные библиотеки могут привести к ошибкам компиляции, поскольку они требуют правильных путей поиска. Поэтому мне интересно, есть ли способ устранить эти ненужные библиотеки. Спасибо!

0

Решение

CMake транзитивно добавляет в зависимые библиотеки, которые можно отключить, установив для свойства LINK_INTERFACE_LIBRARIES пустую строку. Если вы делаете
SET_TARGET_PROPERTIES (lib3 PROPERTIES LINK_INTERFACE_LIBRARIES «»)
тогда CMake не будет генерировать зависимость от приложения к lib1 и lib2 при связывании приложения.

1

Другие решения

Если бы вы создавали статические библиотеки, я бы согласился с тем, что CMake использует ненужные зависимости. Однако вы создаете динамические библиотеки, и я не верю, что CMake добавляет сюда ненужные зависимости. У вас есть цепочка динамических библиотек. В этом случае, если вы ссылаетесь в lib3, компоновщик также должен тянуть в lib2, что затем заставит компоновщик втянуть lib1 чтобы удовлетворить все символьные зависимости для связи вашего приложения.

0

По вопросам рекламы [email protected]