История изменений
Исправление slovazap, (текущая версия) :
Похоже я что-то напутал, а разве должен вообще путь к dir1 (lib1) попадать в пути поиска заголовков в зависимом таргете (exe или другой либе), куда куда library1, без вызова target_include_directories() в файле проекта library1?
Тут сразу несколько вопросов намешано.
Если мы говорим об этом конкретном примере, где цепочка зависимостей такая: app→lib2→lib1, то в lib2 путь к инклудам lib1 попадать безусловно должен, иначе как lib2, используя lib1, найдёт её инклуды? Должен ли он попадать в app зависит от того как устроена lib2 - она может прокидывать через себя интерфейсы lib1 (как например, glib торчит через gtk), то должны, если же она только использует lib1 и никуда им не светит, то не должны. Поведение CMake в этом аспекте контролируется через PUBLIC
/PRIVATE
/INTERFACE
в target_link_libraries и target_include_directories. То есть для случая когда lib2 потребляет lib1 и никак им не светит, нужно было бы делать target_link_libraries(library2 PRIVATE library1)
, тогда получим:
/usr/bin/cc -I/tmp/lib1 -MD -MT CMakeFiles/library1.dir/lib1/empty.c.o -MF CMakeFiles/library1.dir/lib1/empty.c.o.d -o CMakeFiles/library1.dir/lib1/empty.c.o -c /tmp/lib1/empty.c
/usr/bin/cc -I/tmp/lib2 -I/tmp/lib1 -MD -MT CMakeFiles/library2.dir/lib2/empty.c.o -MF CMakeFiles/library2.dir/lib2/empty.c.o.d -o CMakeFiles/library2.dir/lib2/empty.c.o -c /tmp/lib2/empty.c
/usr/bin/cc -I/tmp/lib2 -MD -MT CMakeFiles/foo.dir/empty.c.o -MF CMakeFiles/foo.dir/empty.c.o.d -o CMakeFiles/foo.dir/empty.c.o -c /tmp/empty.c
Ну и надо ещё раз сделать акцент на том что в современном CMake инклуды распространяются только через цели. То есть когда ты используешь библиотеку, нужно сделать только target_link_libraries
, это подтянет как саму библиотеку, так и её заголовки, правильным образом. target_include_directories
на заголовочные файлы зависимости делать никогда не надо.
Исправление slovazap, :
Похоже я что-то напутал, а разве должен вообще путь к dir1 (lib1) попадать в пути поиска заголовков в зависимом таргете (exe или другой либе), куда куда library1, без вызова target_include_directories() в файле проекта library1?
Тут сразу несколько вопросов намешано.
Если мы говорим об этом конкретном примере, где цепочка зависимостей такая: app→lib2→lib1, то в lib2 путь к инклудам lib1 попадать безусловно должен, иначе как lib2, используя lib1, найдёт её инклуды? Должен ли он попадать в app зависит от того как устроена lib2 - она может прокидывать через себя интерфейсы lib1 (как например, glib торчит через gtk), то должны, если же она только использует lib1 и никуда им не светит, то не должны. Поведение CMake в этом аспекте контролируется через PUBLIC
/PRIVATE
/INTERFACE
в target_link_libraries и target_include_directories. То есть для случая когда lib2 потребляет lib1 и никак им не светит, нужно было бы делать target_link_libraries(library2 PRIVATE library1)
, тогда получим:
/usr/bin/cc -I/tmp/lib1 -MD -MT CMakeFiles/library1.dir/lib1/empty.c.o -MF CMakeFiles/library1.dir/lib1/empty.c.o.d -o CMakeFiles/library1.dir/lib1/empty.c.o -c /tmp/lib1/empty.c
/usr/bin/cc -I/tmp/lib2 -I/tmp/lib1 -MD -MT CMakeFiles/library2.dir/lib2/empty.c.o -MF CMakeFiles/library2.dir/lib2/empty.c.o.d -o CMakeFiles/library2.dir/lib2/empty.c.o -c /tmp/lib2/empty.c
/usr/bin/cc -I/tmp/lib2 -MD -MT CMakeFiles/foo.dir/empty.c.o -MF CMakeFiles/foo.dir/empty.c.o.d -o CMakeFiles/foo.dir/empty.c.o -c /tmp/empty.c
Исходная версия slovazap, :
Похоже я что-то напутал, а разве должен вообще путь к dir1 (lib1) попадать в пути поиска заголовков в зависимом таргете (exe или другой либе), куда куда library1, без вызова target_include_directories() в файле проекта library1?
Тут сразу несколько вопросов намешано.
Если мы говорим об этом конкретном примере, где цепочка зависимостей такая: app→lib2→lib1, то в lib2 путь к инклудам lib1 попадать безусловно должен, иначе как lib2, используя lib1, найдёт её инклуды? Должен ли он попадать в app зависит от того как устроена lib2 - она может прокидывать через себя интерфейсы lib1 (как например, glib торчит через gtk), то должны, если же она только использует lib1 и никуда им не светит, то не должны. Поведение CMake в этом аспекте контролируется через PUBLIC
/PRIVATE
/INTERFACE
в target_link_libraries и target_include_directories. То есть для случая когда lib2 потребляет lib1 и никак им не светит, нужно было бы делать target_link_libraries(library2 PRIVATE library1)