Процесс сборки C ++ - зависимости lib - PullRequest
0 голосов
/ 30 мая 2018

У меня есть решение Visual Studio с 5 проектами

  • Main: приложение
  • A, B, C, D: статические библиотеки

Mainзависит от A, B.A зависит от C, D.

У меня хрупкое понимание процесса сборки.

Либс строили в одиночку, особенно A;Я не чувствовал, что связываю C и D с A.

И для создания основного приложения мне нужно было иметь A, B, C и D в качестве входных библиотек, хотя Main напрямую зависит только от A, B.

Теперь я пытаюсь собрать все это на Linux с помощью CMake, и я снова сталкиваюсь с этими ссылками.На этот раз я не хочу использовать грубую силу и предпочел бы понять, как это связывает воедино.

Должен ли я просто собрать A, B, C и D как статические библиотеки .a и сделать так, чтобы Main включил их все?

Как A может строить без символов C и D?

1 Ответ

0 голосов
/ 31 мая 2018

Статические библиотеки - это просто архивы, содержащие объектные файлы (т.е. отдельно скомпилированные исходные файлы).По этой причине при создании статической библиотеки вы не «связываете» ее, а «архивируете» ее.

Символы должны быть разрешены при связывании исполняемого файла или общей библиотеки.На этом этапе компоновщик пытается разрешить все символы, в случае если он не может получить ошибки 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.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...