Как сделать библиотеку C устанавливаемой с помощью угловых скобок, какна Mac - PullRequest
2 голосов
/ 28 марта 2019

Если я зайду в /usr/local/lib, я увижу кучу папок и .dylib файлов, динамически связанных библиотек файлов, в которых я почти уверен.Если я перейду к /usr/local/include, у него будет куча .h файлов, в каждом из которых есть нескомпилированный исходный код на языке С.

Если я поместу файл .h в /usr/local/include/mylib.h, и яиметь локальный файл .c или .h, скажем, ~/Desktop/test/foo.c, тогда внутри foo.c я могу включить mylib.h:

~/Desktop/test/foo.c

#include <mylib.h>

int
main() {
  puts("Hello World");

  return 0;
}

Если я буду следовать этому , я напишу это в терминале:

$ clang -Xlinker -v
@(#)PROGRAM:ld  PROJECT:ld64-351.8
configured to support archs: armv6 armv7 armv7s arm64 i386 x86_64 x86_64h armv6m armv7k armv7m armv7em (tvOS)
Library search paths:
  /usr/lib
  /usr/local/lib
Framework search paths:
  /Library/Frameworks/
  /System/Library/Frameworks/

Итак, /usr/local/lib там, который представляет собой набор .dylib файлов.Я не могу изменить /usr/lib.

У меня вопрос, как я могу взять локальную библиотеку C, такую ​​как ~/Desktop/test/mylib.{c,h}, и интегрировать ее в места установки этих других библиотек C, подобно тому, что делает homebrewвероятно.

Я хотел бы иметь возможность включать библиотеку с <угловыми скобками> вместо "кавычек".

Так что у меня есть библиотека mylib.h и mylib.c.

mylib.c

#include "mylib.h"

void
print(char* str) {
  puts(str);
}

mylib.h

#include "stdlib.h"
#include "stdio.h"

extern
void
print(char* str);

Тогда у меня есть foo.c, который включает его.

foo.c :

#include <mylib.h>

int
main() {
  print("Foo");
  return 0;
}

Вопрос в том, как мне скомпилировать mylib и foo.c с Clang, чтобы я мог #include <mylib.h> сугловые скобки в любом проекте, например foo.c.

. Я строил их так:

build:
  @clang -shared -fpic -O2 \
    -install_name mylib.dylib \
    -o mylib.dylib \
    mylib.c
  @clang foo.c build.dylib -o foo
  @./foo
.PHONY: build

Кажется, это работает, но теперь вопрос в том, как разместить их программно (безXCode) в нужное место, чтобы он работал с загрузкой через угловые скобки.

Ответы [ 2 ]

5 голосов
/ 11 апреля 2019

Если вы настаиваете:

  • Создайте общую библиотеку (.dylib) и поместите ее в /usr/local/lib.

  • Скопируйте заголовок в /usr/local/include.

После этого вы сможете связываться, используя:

gcc -o program source.c function.c -lmylib

И вы сможете написать #include <mylib.h> в своем исходном коде, и заголовок будет найден.

С другой стороны, часто считается, что заголовки проекта лучше включать в кавычки (#include "mylib.h"), и вы можете указать каталоги, в которых заголовки и библиотеки находятся в командной строке компилятора (-I/some/where/include для заголовки; -L/some/where/lib для библиотек).

0 голосов
/ 10 апреля 2019

Время от времени я вижу проекты C, такие как this и BareMetalOS (это имеет смысл для BareMetalOS), где они включают туда такие файлы, как #import вместо #import "foo.h".
Интересно, как я могу сделать так, чтобы мою библиотеку можно было импортировать.

Когда проекты включают заголовки каталогов проектов с использованием угловых скобок, обычно происходит то, что система сборки добавляет каталоги в путь поиска включения компилятора при каждом вызове компилятора (в основном, как -I some/project/subdir)

Если наличие личного «системного» каталога, который автоматически ищется, отвечает вашим потребностям, это самое простое. Чтобы установить это, параметры командной строки, которые вы должны передать, скорее всего -isystem и ваш выбор ничего: -L, -F, возможно -B, возможно -Wl,-rpath (получение храбрости сейчас), а в идеале не -I (имеет тенденцию помешать предположениям о порядке в сценариях сборки). Если вы не экспериментируете, не прибегайте к -isysroot или -resource-dir, пока не станет ясно, как к этому обращаться).

Флаги, которые вы выбираете, могут быть сделаны неявными, добавляя их в CFLAGS, вызывая clang со скриптом-оберткой (что-то вроде eval "clang -my -options ${@}"); или путем установки дополнительных каталогов поиска в переменных окружения LIBRARY_PATH, C_INCLUDE_PATH (для c), CPLUS_INCLUDE_PATH (для c ++) и / или CPATH (оба) (по крайней мере, для систем Linux; я предполагаю, что они уважают их в Apple, но я не уверен .)

По-настоящему законченное решение - это перестройка clang с выбранным вами путем поиска.

Убедитесь, что вы создаете свой dylib с правильными флагами ссылок (разве это не нужно --shared?)

...