CMake и проблеми със заглавните файлове в подпапките

Опитвам се да настроя проект, при който заглавните файлове могат да бъдат намерени от src кода на библиотеките на подпапките, както и src кода в най-високото ниво с помощта на Cmake. В момента получавам грешка, че заглавният файл не може да бъде намерен. Структурата на моя проект изглежда така:

root/
    src/           
        CMakeLists.txt     #(top level)  
        main.c     
        lib/
            lib1.c
            CMakeLists.txt     #(lower level)
            headers/
                lib1.h
    build/       

Моят CMakeLists.txt от най-високо ниво изглежда така:

cmake_minimum_required(VERSION 3.13.4)

project(CmakeTUT_Proj) 

add_executable(${PROJECT_NAME} main.c)

target_include_directories(${PROJECT_NAME} PUBLIC Lib/headers/)
                                                          
add_subdirectory(Lib/)

target_link_directories(${PROJECT_NAME} PRIVATE Lib/headers/)

target_link_libraries(${PROJECT_NAME} name_of_lib) 

Моят CMakeLists.txt от по-ниско ниво изглежда така:

add_library(name_of_lib  adder.c)

Моите програми main.c и lib1.c включват библиотеката като #include "lib1.h", cmake работи добре без никакви грешки, но когато изграждам проекта с make, получавам грешка като:

root/src/Lib/lib1.c:2:10: fatal error: lib1.h: No such file or directory
#include "lib1.h"

Искам да структурирам проекта си така, че main.c и lib1.c да имат достъп до lib1.h. Някакви идеи? Благодаря ти.


person programmer25    schedule 04.01.2021    source източник
comment
Помислете за target_include_directories(${PROJECT_NAME} PUBLIC Lib/)... Заглавният файл наистина ли е в Lib?   -  person Some programmer dude    schedule 04.01.2021
comment
@Someprogrammerdude Грешка, това беше печатна грешка, все още не работи по този начин   -  person programmer25    schedule 04.01.2021
comment
Позволих си да редактирам описанието на структурата на вашия проект, за да го направя, надявам се, по-лесно за разбиране.   -  person Thomas    schedule 04.01.2021
comment
add_library(name_of_lib - няма name_of_lib библиотека. target_link_directories липсва ). Добавихте ли директорията headers в пътеките за търсене при компилирането на lib1.c?   -  person KamilCuk    schedule 04.01.2021


Отговори (1)


Както подсказва името, target_include_directories засяга само една цел. Така че, когато зададете target_include_directories(${PROJECT_NAME} PUBLIC Lib/headers/), това добавя към включващия път за изпълнимия целеви файл с име ${PROJECT_NAME}, но не и към включващия път за библиотеката name_of_lib.

За да коригирате това, можете да добавите включващия път за вашата библиотека в по-ниското ниво CMakeLists.txt:

target_include_directories(name_of_lib PUBLIC headers)

Като бонус, тъй като е PUBLIC, този път също се добавя автоматично към всяка цел, която зависи от name_of_lib. Така че в най-високото ниво CMakeLists.txt можете да премахнете този ред:

target_include_directories(${PROJECT_NAME} PUBLIC Lib/headers/)

Освен това този ред изглежда безполезен и вероятно също може да бъде премахнат:

target_link_directories(${PROJECT_NAME} PRIVATE Lib/headers/)

Библиотеките с връзки обикновено не се поставят в директории със заглавки.

person Thomas    schedule 04.01.2021