У меня следующие библиотеки lib_A, lib_B, lib_C, lib_D. Я делаю что-то подобное в моих Cmake файлах (порядок важен):cmake library linking order
- ADD_LIBRARY (lib_A)
- ADD_LIBRARY (lib_B)
- ADD_LIBRARY (lib_C)
- ADD_LIBRARY (lib_D)
- TARGET_LINK_LIBRARIES (lib_B lib_C)
- TARGET_LINK_LIBRARIES (lib_A lib_B)
- ADD_EXECUTABLE (EXEC)
- TARGET_LINK_LIBRARIES (EXEC lib_A)
- TARGET_LINK_LIBRARIES (EXEC lib_D)
Это приводит к следующей команды линкера.
линкер -llib_A -llib_D -llib_B -llib_C
Q1. Почему lib_B и lib_C после lib_D?
Q2. Когда я изменяю CMake немного и сделать что-то вроде этого:
8_ TARGET_LINK_LIBRARIES (lib_A lib_D) 9_ TARGET_LINK_LIBRARIES (EXEC lib_A)
затем связывая порядок, как это линкер -llib_A -llib_B -llib_C -llib_D Здесь lib_B и lib_C находятся перед lib_D. Это означает, что target_link_libraries работает по-разному для исполняемых целей и целей библиотеки. Я прав?
Проблема в том, что lib_B и lib_C также зависят от lib_D, но я не хочу делать target_link_libraries (lib_B lib_D) и target_link_libraries (lib_C lib_D), потому что у меня больше таких случаев, и мне нужно будет это сделать вручную для каждой библиотеки. Конечно, как в Q2 решает проблему, но Q3 - этот заказ гарантирован каким-то образом по cmake или это просто случайность?
Спасибо
Не уверен, что о разница в порядке между exes и libs, но если B и C оба зависят от D, вы должны действительно указать это. – Fraser
Проблема в том, что B и C логически являются частью платформы, независимой от A и A, зависит от платформы lib D. Я знаю, что я должен это делать, но у меня их много, и это делает вручную, приложит немало усилий для ее поддержания и обеспечения некоторое автоматическое решение увеличит сложность моей системы сборки на основе cmake. Другая проблема заключается в том, что, когда я буду явно устанавливать эту зависимость D для каждой независимой от платформы библиотеки, это приведет к тому, что D будет отображаться в списке компоновщиков много раз. – user2301299
У меня такая же проблема с внешней библиотекой - например, boost. Я хотел бы избежать установки зависимости для повышения в каждой библиотеке. – user2301299