Статические библиотеки - это просто архивы, содержащие объектные файлы (т.е. отдельно скомпилированные исходные файлы).По этой причине при создании статической библиотеки вы не «связываете» ее, а «архивируете» ее.
Символы должны быть разрешены при связывании исполняемого файла или общей библиотеки.На этом этапе компоновщик пытается разрешить все символы, в случае если он не может получить ошибки undefined reference
.Но, опять же, это относится к связыванию.Статические библиотеки не должны иметь все символы, определенные в них.
В вашем случае, если A
, B
, C
и D
являются статическими библиотеками, они будут построены независимо от каждогоДругой.Единственное, что вам нужно собрать A
из C
и D
- это файлы заголовков, которые нужны компилятору.
Когда вы создаете исполняемый файл, вам нужно указать все статические библиотеки,даже если Main
не "напрямую" ссылается на символы из C
или D
.
Теперь, даже несмотря на то, что статические библиотеки не могут неявно зависеть от других библиотек, CMake предоставляет способ выразить такие зависимости напостроить системный уровень.Вы можете выполнить следующую команду
add_library(C STATIC ${B_SOURCES})
add_library(D STATIC ${D_SOURCES})
add_library(A STATIC ${A_SOURCES})
target_link_libraries(A PUBLIC C D)
target_link_libraries
, приведенную выше, чтобы не связать A
с C
и D
- как я уже писал, статические библиотеки не работают.Вместо этого он сообщает CMake, что при связывании исполняемого файла с A
он должен связать его также с C
и D
:
add_executable(Main ${MAIN_SOURCES})
target_link_libraries(Main PRIVATE A)
Даже если target_link_libraries
включает только A
,Makefile, сгенерированный CMake, также будет связывать C
и D
- потому что они были определены как зависимости A
.
dllexport и dllimport
Эти два атрибута относятся только к общим библиотекам (DLL).Они управляют тем, какие символы экспортируются из DLL (т.е. доступны из исполняемого файла, который ссылается на эту DLL). Вот ссылка , описывающая идею и эквивалент в Linux.