используя мою собственную статическую / динамическую библиотеку: КАК Скомпилировать и связать (правильный способ сделать все правильно) - PullRequest
0 голосов
/ 18 июня 2019

Извините за этот вопрос новичка.

Context

Я только что создал свою собственную библиотеку (используя CMake):

libmyownsomething.a <--- static version of the compiled library
libmyownsomething.so <--- dinamic version of the same library
libmyownsomething.h <--- the header file to be included in other project

Вопросы :

  • Где правильное место, где файлы должны быть размещены? (Я гость /usr/local/include/ и /usr/local/lib/

  • Как скомпилировать другие lib / проекты с этим, вставив только #include <myownsomething.h> и правый флаг LDFLAGS=-lmyownsomething?

1 Ответ

1 голос
/ 18 июня 2019

Чтобы иметь возможность связывать вашу библиотеку с помощью -lmyownsomething, вам необходимо иметь libmyownsomething.so (или .a для статического связывания) в одном из каталогов, которые компоновщик ищет по умолчанию.

Я нашел это в документации texinfo для GNU ld ( путь поиска библиотеки в скрипте компоновщика ):

'SEARCH_DIR (PATH)'

 The 'SEARCH_DIR' command adds PATH to the list of paths where 'ld'
 looks for archive libraries.  Using 'SEARCH_DIR(PATH)' is exactly 
 like using '-L PATH' on the command line

Теперь в GNU ld (точнее, ld.bfd) используется скрипт компоновщика по умолчанию , который можно получить с помощью --verbose.Давайте посмотрим, какие каталоги поиска существуют по умолчанию (в любом случае, в моей системе - это вполне может зависеть от конфигурации; если вы собираетесь распространять свою библиотеку, вы, вероятно, захотите сделать наиболее переносимый выбор):

$ ld --verbose |& grep SEARCH_DIR 
SEARCH_DIR("/usr/x86_64-pc-linux-gnu/lib64"); SEARCH_DIR("/usr/lib"); SEARCH_DIR("/usr/local/lib"); SEARCH_DIR("/usr/x86_64-pc-linux-gnu/lib");

Чтобы ответить на вопрос о #include файлах, вам нужно обратиться к документации компилятора или, возможно, к стандарту POSIX.(Тем не менее, я бы рекомендовал либо выбрать самый простой вариант - см. Ниже), либо предоставить настраиваемый способ установки ваших файлов, например, с опцией --prefix время сборки. Тогда пользователь / упаковщик может выбрать лучшее место для их размещения.для себя. Но ничто не мешает вам предоставлять разумные значения по умолчанию. То же самое относится и к библиотекам, но я попытался ответить на эту часть вопроса в точности так, как это было задано.)

Как правило, этот материал варьируется от системы к системе,но они обычно следуют Стандарту Иерархии Файловой системы .Я думаю, /usr/include и /usr/lib - самый безопасный выбор.Еще одна хорошая практика - использовать, например, механизм pkgconf.

Надеюсь, это поможет.Я действительно должен был сначала спросить о вашем сценарии использования: кому и как вы собираетесь распространять свое программное обеспечение?В любом случае, обязательно оставляйте комментарии.Кроме того, мне интересно, является ли это материалом Stackoverflow;возможно, ему нужно переехать в другое место.

...