Я пытаюсь перенести огромную базу кода из собственного внутреннего набора инструментов в Cmake.Этот код состоит из множества общих библиотек и некоторых исполняемых файлов.
Некоторые из этих библиотек взаимозависимы.Давайте возьмем в качестве примеров Lib1 и Lib2, где Lib1 использует символы из Lib2, а Lib2 использует символы из Lib1.
Чтобы создать библиотеку DLL Lib1, нам нужны экспортированные символы из Lib2, которые, в свою очередь, требуют экспортированные символы из Lib1.В настоящее время мы решили эту проблему путем объединения в два этапа, как описано здесь: Взаимный импорт ).Это дает нам следующие шаги:
- Создание lib1.lib и lib1.exp
Создание lib2.lib и lib2.exp - Создание lib1.DLL с использованием lib1.obj иlib2.lib / lib2.exp
Создание lib2.DLL с использованием lib2.obj и lib1.lib / lib1.exp
Я знаю, что это запах кода, но базовая базаслишком большой, чтобы попытаться исправить все эти циклы.Поэтому я хотел бы получить аналогичный результат, используя Cmake.Я не нашел никакого способа сделать это из документации, за исключением использования только пользовательских команд, которые полностью уничтожили бы цель этого инструмента.
Устаревшая цепочка инструментов выполняет следующие вызовы:
# compile sources
cl lib1\SRC\lib1help.cpp ... /Fo"build\cl\lib1.obj"
cl lib2\SRC\lib2help.cpp ... /Fo"build\cl\lib2.obj"
# create lib + exp symbols
lib /DEF build\cl\lib1.obj /OUT:build\link1\lib1.lib
lib /DEF build\cl\lib2.obj /OUT:build\link1\lib2.lib
# create mutual dependant dll using exp
link build\cl\lib1.obj build\link1\lib2.lib /DLL /OUT:build\link2\lib1.dll
link build\cl\lib2.obj build\link1\lib1.lib /DLL /OUT:build\link2\lib2.dll
На данный момент у меня есть следующий CmakeLists.txt:
add_library(lib2 SHARED lib2/src/lib2help.cpp)
add_library(lib1 SHARED lib1/src/lib1help.cpp)
target_include_directories(lib1 PUBLIC lib1/include/)
target_compile_definitions(lib1 PRIVATE __LIB1)
target_link_libraries(lib1 PRIVATE lib2)
target_include_directories(lib2 PUBLIC lib2/include/)
target_compile_definitions(lib2 PRIVATE __LIB2)
target_link_libraries(lib2 PRIVATE lib1)
Это дает мне следующий результат:
[cmake] CMake Error: The inter-target dependency graph contains the following strongly connected component (cycle)
[cmake] "lib2" of type SHARED_LIBRARY
[cmake] depends on "lib1" (weak)
[cmake] "lib1" of type SHARED_LIBRARY
[cmake] depends on "lib2" (weak)
Ребята, вы знаете, как я мог бы реализовать это с помощью Cmake?
Пока я планирую ориентироваться только на системы Windows, но независимость от ОС будет потрясающей!
Спасибо