Я использую CMake для создания приложения, состоящего из четырех проектов:
- a.dll , которая не зависит
- b.dll , что зависит от a.dll
- c.exe , что зависит от a.dll и b.dll
- d.exe , который зависит от a.dll и b.dll
Каждый проект (или цель в терминологии CMake) находится в своем собственном подкаталоге и имеет собственный файл CMakeLists.txt . Кроме того, существует файл верхнего уровня CMakeLists.txt , который связывает их всех (используя add_subdirectory
).
В CMakeLists.txt файлах b.dll , c.exe и d.exe , которые я использую target_link_libraries
, чтобы связать эти цели с библиотеками импорта a.dll и b.dll . Это работает правильно. Пока все хорошо.
Теперь в Visual Studio кажется, что CMake не устанавливает никаких «зависимостей проекта» между различными проектами решения: если я выберу Проект -> Зависимости проекта ... , я можно увидеть, что действительно b.dll не имеет зависимости от a.dll , c.exe не имеет зависимости ни от a.dll , ни b.dll и т. д. В результате порядок сборки проектов по существу случайный, и на практике решение просто не удается построить (поскольку, например, c.exe создается до a.dll , поэтому соответствующая библиотека импорта a.lib еще не создана).
Я довольно озадачен. Я очень тщательно искал в сети ответ, но без удачи (что заставляет меня думать, что это не проблема для большинства пользователей CMake, и я, должно быть, делаю что-то не так).
Обратите внимание, что я также пытался использовать команду add_dependencies
, но это не имело никакого эффекта.
Я использую CMake 2.8.1 и Visual Studio 2008 (9.0).
Спасибо,
Franz
Вот файлы CMakeLists.txt , для справки:
top-level CMakeLists.txt :
add_subdirectory(a)
add_subdirectory(b)
add_subdirectory(c)
add_subdirectory(d)
а / CMakeLists.txt
add_library(a SHARED a.cpp)
б / CMakeLists.txt
add_library(b SHARED b.cpp)
target_link_libraries(b a)
# also tried to add add_dependencies(b a) here
с / CMakeLists.txt :
add_executable(c c.cpp)
target_link_libraries(c a b)
# also tried to add add_dependencies(c a b) here
d / CMakeLists.txt
add_executable(d d.cpp)
target_link_libraries(d a b)
# also tried to add add_dependencies(d a b) here