如果我进入/usr/local/lib,我会看到很多文件夹和.dylib文件,我很确定这些文件是动态链接的库文件。如果我转到/usr/local/include,则有一堆.h文件,每个文件都具有未编译的纯C源代码。

如果我在.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;
}

如果我遵循this,则在终端中编写:
$ 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库的安装位置中,这可能类似于自制软件。

我希望能够使用而不是“引号”来包含库。

假设我有一个库mylib.hmylib.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;
}

问题是我如何使用Clang编译mylibfoo.c,以便在诸如#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)将它们放置到某个合适的位置,以使其通过尖括号加载。

最佳答案

如果你坚持:

  • 构建共享库(.dylib)并将其放入/usr/local/lib中。
  • 将 header 复制到/usr/local/include

  • 然后,您可以使用以下链接:
    gcc -o program source.c function.c -lmylib
    

    并且您将能够在源代码中编写#include <mylib.h>,并且将找到 header 。

    另一方面,通常认为最好使用引号(#include "mylib.h")来包含项目 header ,并且可以指定在编译器命令行上找到 header 和库的目录( header 为-I/some/where/include; header 为-L/some/where/lib)。

    关于macos - 如何在Mac上使用尖括号(如<mylib.h>)安装C库,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/55418664/

    10-12 03:06