Связывание внешних переменных с использованием нескольких библиотек в C - PullRequest
1 голос
/ 21 января 2020

В моем проекте две библиотеки и одна программа.

  • Lib1.c и Lib1.h - это два файла первой библиотеки (Lib1.so).
  • Lib2.c и Lib2.h - два файла второй библиотеки (Lib2.so).
  • prog.c - основной файл программы (prog).

Программа (prog) связан только со второй библиотекой (Lib2.so), а вторая библиотека (Lib2.so) связана с первой библиотекой (Lib1.so).

В Lib1.c, I есть объявление глобальной переменной (int var = 0;) и в Lib1.h, у меня есть объявление (extern int var;).

В Lib2.h, у меня есть объявление (extern int var;), чтобы используйте переменную var в основной программе.

В функции main() я включаю Lib2.h в prog.c файл и у меня есть объявление (var = 5;)

Lib1. c:

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

int var = 0;

int funct(void)
{
    printf("hello world \n");
    return 0;
}

Lib1.h:

extern int var;

int funct(void);

Lib2. c:

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

int funct2(void)
{
    printf("Library 2 \n");
    funct();
    return 0;
}

Lib2.h:

#include "Lib1.h"

extern int var;

int funct2(void);

prog. c:

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

int main() 
{
    var = 5;
    printf("===>var=%d\n", var);
    funct2();
    return 1;
}

Команды:

gcc -c -Wall -Werror -fpic Lib1.c 
gcc -shared -o Lib1.so Lib1.o
gcc -c -Wall -Werror -fpic Lib2.c
gcc -shared -o Lib2.so Lib2.o -ldl /home/test/Lib1.so
gcc prog.c -o prog -ldl /home/test/Lib2.so

Когда я пытаюсь скомпилировать программу (prog.c), я получаю сообщение об ошибке Шаг ссылки, как показано ниже.

/usr/bin/ld: /tmp/ccKaq16a.o: undefined reference to symbol 'var'
/home/test/Lib1.so: error adding symbols: DSO missing from command line

Есть ли способ использовать переменную var в основной функции, если она определена в первой библиотеке?

1 Ответ

0 голосов
/ 21 января 2020

Вы связываете свою программу с Lib2, но не с Lib1. Вы должны добавить это также. Вам также не нужно явно связывать Lib1 при создании Lib2

gcc -c -Wall -Werror -fpic Lib1.c 
gcc -shared -o Lib1.so Lib1.o
gcc -c -Wall -Werror -fpic Lib2.c
gcc -shared -o Lib2.so Lib2.o
gcc prog.c -o prog /home/test/Lib2.so /home/test/Lib1.so
...