Действия, необходимые для связывания, аналогичны обычному потоку проекта C ++.
Для проекта с такой структурой:
src
A.cpp
A.h
B.cpp
B.h
Когда код в B.cpp
хочет использовать функция, определенная в A.h
, должна объявить ее с помощью оператора #include<A.h>
, таким образом, код A.h
копируется препроцессором, поэтому модуль перевода B.cpp
знает о его существовании.
На этапе ссылки все объектные файлы связаны - «обещание», которое вы дали, заявив, что все объявления A.h
выполняются A.o
.
Аналогично, когда test.cpp
использует функцию из библиотеки - вы сначала нужно объявить это, вот почему вы должны использовать target_include_directories
и включать ab.h
в test.cpp
.
Затем на этапе компоновки вы должны сообщить компоновщику, где объявлена реализация этих функций в ab.h
найдены (ваш статический / динамический c файл библиотеки), для этого вы используете target_link_libraries
.