繁体   English   中英

安装和使用共享库

[英]Installing and using a shared library

我有一个正在处理的项目,目前有一个matrix.c文件,其中包含一些函数,并有一个相应的 header matrix.h 我使用matrix.c和另一个文件创建了一个共享库libccalc.so 我正在尝试在/usr/local/lib中创建一个目录,在/usr/local/include中创建一个目录,这两个目录都称为ccalc以容纳各自的.so.h文件,这些文件稍后可用于使用该功能编译程序libccalc.so的。 但是,当我这样做时,出现错误。

准确地说, matrix.c包含函数:
Matrix *mat_create(int rows, int cols) ,
void mat_fill(Matrix *mat, double *entries)
void mat_print(Matrix *mat)
matrix.h中声明。 如上所述,我将文件放在各自的目录中,运行ldconfig /usr/local/lib/ccalc并在其他目录中创建一个新文件test.c ,内容如下:

// test.c

#include <stdio.h>
#include "matrix.h"

int main() {
    Matrix *m = mat_create(2, 2);
    double entries[4] = {1, 2, 3 ,4};
    mat_fill(m, entries);

    mat_print(m);

    return 0; 
}

matrix.h包含以下内容:

// matrix.h

#ifndef MATRIX_H
#define MATRIX_H

#define MAX_SIZE 50

typedef struct Matrix Matrix;

struct Matrix {
    int rows;
    int cols;
    double *data;
};

Matrix *mat_create(int n, int p);
void mat_fill(Matrix *mat, double *entries);
void mat_print(Matrix *mat);

#endif

当我输入命令时: gcc -I/usr/local/include/ccalc -L/usr/local/lib/ccalc -lccalc test.c -o test ,我收到错误:

/usr/bin/ld: /tmp/ccesD44J.o: in function `main':
test.c:(.text+0x26): undefined reference to `mat_create'
/usr/bin/ld: test.c:(.text+0x71): undefined reference to `mat_fill'
/usr/bin/ld: test.c:(.text+0x7d): undefined reference to `mat_print'
collect2: error: ld returned 1 exit status

但是,当我将libccalc.somatrix.h放在/usr/local/lib/usr/local/include时,输入ldconfig并输入命令gcc -L/usr/local/lib/ccalc -lccalc test.c -o test ,然后运行./test ,它完美运行

有人能告诉我我做错了什么吗?

程序 arguments 到gcc的顺序很重要。 请阅读有关调用 GCC的文档。

此外, test通常是一个内置命令。 请参阅测试 (1)

所以(在 Linux 上)将test.c重命名为prog.c然后编译你的程序

   gcc -Wall -Wextra -g prog.c -L/usr/local/lib/ccalc -lccalc -o prog

然后使用strace(1)gdb(1)了解prog的行为,并使用ldd(1)objdump(1)readelf(1)分析prog 另见elf(5)ld.so(8)

关于构建共享库,请阅读 Drepper 的论文How to write shared libraries

你可能想编译matrix.clibcalc.so使用

gcc -fPIC -Wall -O -shared -g matrix.c -o libcalc.so

但您可能需要其他程序 arguments。

关于矩阵运算,这个答案可能是鼓舞人心的。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM