我正在尝试找出安装C和C ++代码的简化方法 和它们构建的库,主要用于Linux。我认为 GNU Autotools,CMake等对我正在尝试做的事情来说太过分了。
一个例子:我写了一些代码,当'make'运行时,构建到 创建一个库'example.a'。 (到目前为止,我将使用静态链接。 共享图书馆将引入更多问题;我走路之前会爬行。)使用这些功能需要包括'example1.h','example2.h'等。
使用Autotools,可以运行'make install'或'sudo make install' 将example.a复制到/ usr / local / lib并将包含文件复制到/ usr / local / include。 如果已构建可执行文件,则会将这些文件复制到/ usr / local / bin。
我已尝试将以下行添加到我的makefile中:
安装:
cp example.a / usr / local / lib
cp example1.h / usr / local / include
cp example2.h / usr / local / include
cp示例/ usr / local / bin
这似乎很有效。其他项目则可以“看到” .h文件并正确构建。但找不到.a文件;唯一的 让它被链接的方法是明确地给出路径 /usr/local/lib/example.a。 (虽然gcc坚称它正在寻找图书馆 在那条路上。)所以:
问题1:我的用户构建的库是否应该放在/ usr / local / lib中?或者是 我使用了错误的目录?
现在,我的下一个问题是:必须使用'sudo make install'来完成。 我认为对于这种类型的一些项目,只有一个用户会 利用有问题的代码,图书馆应该去某个地方 比如$ HOME / lib,包含文件到$ HOME / include,可执行文件到 $ HOME / bin中。
问题2:是否有“标准”方法来安装包含/库 只是当前用户,而不是为所有用户这样做? (从而避免 根本使用的需要,我认为如果只是,它将是一个“更清洁”的系统 使用该程序的用户必须处理这些文件。)
答案 0 :(得分:1)
您应该使用install
来使用显式权限进行复制。 example.a
可能没有找到,因为它不是以lib开头的(我知道这是一个愚蠢的要求)。
将lib
,include
和bin
置于$HOME/
。local下可能是最符合每用户标准设置的内容。
修改强>
我刚测试了它,/usr/local/lib
对我来说很好用:
<强> foo.c的强>
#include <stdio.h>
void foo() { puts("foo"); }
编译并安装:
gcc -c foo.c
ar crs libfoo.a foo.o
install -m 0755 /usr/local/lib #0644 should do too
在另一个目录中:
<强>的main.c 强>
void foo(void);
int main() { foo(); return 0; }
编译,链接和运行:
gcc main.c -lfoo
./a.out