LINUX.ORG.RU

Зависимости между подкаталогами

 


0

1

есть helloworld проект с файловой структурой

/CMakeLists.txt
/lib/CMakeLists.txt
/lib/libhello.cpp
/exe/CMakeLists.txt
/exe/exeworld.cpp

в lib собирается библиотека и в exe бинарник, который должен с ней линковаться. Библиотека собирается нормально, но подкаталог exe (похоже) ничего не знает о цели LibHello и закономерно падает на стадии линковки. Если весь код из вложенных CMakeLists (или только из exe) перенести в главный CMakeLists, то все работает, но хочется разруливать зависимости именно на уровне подкаталогов.

вопрос - как?

// я думаю, что надо как-то экспортировать информацию о целях в PARENT_SCOPE, но не нагуглил как

Ответ на: комментарий от Reset

CMakeFiles/ExeWorld.dir/main.cpp.o: In function `main':
main.cpp:(.text+0x11): undefined reference to `LibHello::printHello()'
collect2: ошибка: выполнение ld завершилось с кодом возврата 1

seed_stil ★★
() автор топика

ССЗБ

было:

set( EXE_LIBRARIES ${LibHello} )
add_executable( ExeWorld ${EXE_SOURCES} )
add_dependencies( ExeWorld LibHello)
target_link_libraries( ExeWorld ${EXE_LIBRARIES} )
стало:
set( EXE_LIBRARIES LibHello )
add_executable( ExeWorld ${EXE_SOURCES} )
add_dependencies( ExeWorld LibHello)
target_link_libraries( ExeWorld ${EXE_LIBRARIES} )

seed_stil ★★
() автор топика
Ответ на: ССЗБ от seed_stil

add_dependencies не нужно. Имя цели-библиотеки в target_link_libraries всё что нужно сделает.

slovazap ★★★★★
()
Ответ на: комментарий от Reset

target_link_libraries(exe hello)

Если я правильно помню, то target_link_libraries() работает только в директории с целью. Вынести её в корневой CMakeLists.txt нельзя. Другими словами, exe уже должен знать, куда lib положит библиотеку.

Я это как правило делаю через кеш-файл:

# lib
set( EXE_LIBRARIES "mylib" CACHE "" "" FORCE )
mark_as_advanced( EXE_LIBRARIES )

# exe
target_link_libraries( myexe ${EXE_LIBRARIES} )

Можно и через PARENT_SCOPE, но тогда пробрасывать прийдётся из каждой поддиректории на уровень выше, что в случае с глубокой вложеностью сильно усложняет код. Кеш же работает глобально.

Dendy ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.