如何在Mac上使用<mylib.h>在尖括号中安装C库

时间:2019-03-27 23:11:31

标签: macos c linker clang

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

如果我将.h文件放在/usr/local/include/mylib.h上,而我在本地还有另一个.c.h文件,比如说~/Desktop/test/foo.c,然后在{{ 1}}我可以加入foo.c

mylib.h

~/Desktop/test/foo.c

如果我遵循this,请在终端中输入:

#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库,并将其集成到其他C库的安装位置中,类似于自制软件。

我希望能够在库中使用<尖括号>代替“引号”。

假设我有一个图书馆~/Desktop/test/mylib.{c,h}mylib.h

mylib.c

mylib.c

mylib.h

#include "mylib.h"

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

然后我有#include "stdlib.h" #include "stdio.h" extern void print(char* str); ,其中包括它。

foo.c

foo.c

问题是我如何使用Clang编译#include <mylib.h> int main() { print("Foo"); return 0; } mylib,以便在foo.c之类的任何项目中都可以用尖括号将#include <mylib.h>编译。

我一直在像这样构建它们:

foo.c

这似乎可行,但是现在的问题是如何以编程方式(不使用XCode)将它们放置到某个合适的位置,以使其能够通过尖括号加载。

2 个答案:

答案 0 :(得分:5)

如果您坚持:

  • 构建共享库(.dylib)并将其放入/usr/local/lib

  • 将标头复制到/usr/local/include

您将可以使用以下链接:

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

然后您就可以在源代码中编写#include <mylib.h>,并且将找到标题。

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

答案 1 :(得分:0)

  

我经常看到C项目,例如this和BareMetalOS(对BareMetalOS来说很有意义),它们在其中包含#import而不是#import“ foo.h”这样的文件。
  想知道如何才能像这样导入我的库。

当项目使用尖括号包含项目目录标题时,通常发生的情况是,构建系统在每次调用编译器时都将目录添加到编译器的include搜索路径中(主要类似于-I some/project/subdir

如果有一个自动搜索的个人“系统”目录满足您的需求,那就是最简单的事情。要进行设置,您可能要传递的命令行选项可能是-isystem,而您选择的任何内容都不是-L-F,也许是-B也许是< / em> -Wl,-rpath(立即开始勇敢尝试),最好是 not -I(倾向于构建脚本中的排序假设)。除非您正在尝试,否则请不要诉诸-isysroot-resource-dir,直到很清楚这是如何被要求的为止。

通过使用包装器脚本(诸如eval "clang -my -options ${@}"之类的clang调用),可以将您选择的标志隐式地添加到CFLAGS中;或通过在环境变量LIBRARY_PATH,C_INCLUDE_PATH(对于c),CPLUS_INCLUDE_PATH(对于c ++)和/或CPATH(两者)(至少对于linux系统)中设置其他搜索目录(至少对于linux系统;我想它在Apple上会尊重它们),但我不确定)

真正完整的解决方案是使用您希望的搜索路径配置来重建clang。

还要确保您也使用正确的链接标志来构建dylib(不需要--shared吗?)