如果我进入/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)将它们放置到某个合适的位置,以使其能够通过尖括号加载。
答案 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
吗?)