Скомпилируйте библиотеку разделяемых объектов, которая вызывает функцию - PullRequest
6 голосов
/ 17 ноября 2011

У меня есть файл f2.cpp

// f2.cpp
#include <iostream>

void f2()
{
    std::cout << "It's a call of f2 function" << std::endl;
}

Я использую cygwin с компилятором crosstool gcc.

g++ -fPIC -c f2.cpp
g++ -shared -o libf2.so f2.o

У меня есть файл libf2.so. Теперь я хочу вызвать функцию f2 в библиотеке f1 (тоже общий объект) libf1.so.

Это f1.cpp, и я хочу взять f1.so

// f1.cpp
#include <iostream>
void f1()
{
    std::cout << "f1 function is calling f2()..." << std::endl;
    f2();
}

Как мне скомпилировать f1.cpp? Я не хочу использовать dlclose, dlerror, dlopen, dlsym ... Наконец, я хочу использовать f1.so в main.cpp в качестве библиотеки общих объектов ... без использования dlclose, dlerror, dlopen, dlsym. Как мне скомпилировать main.cpp, когда у меня будет f1.so?

// main.cpp
#include <iostream>
int main()
{
    f1();
    return 0;
}

Ответы [ 3 ]

3 голосов
/ 17 ноября 2011

объявите f2 () в заголовочном файле.и скомпилируйте libf1.so, аналогичный libf2.

Теперь скомпилируйте основную ссылку на f1 и f2.Это должно выглядеть примерно так g++ -lf2 -lf1 -L /path/to/libs main.o

2 голосов
/ 17 ноября 2011

Вы можете просто связать их вместе (если f2 скомпилировано в libf2.so, вы передаете -lf2 компоновщику). Линкер позаботится о соединении звонков от f1 до f2. Естественно, во время выполнения f1 ожидает найти f2 в пути загрузки SO, и динамический загрузчик загрузит его.

Вот более полный пример, взятый из части Makefile, который я нашел лежащим вокруг. Здесь mylib означает ваш f2, а main_linked означает f1:

mylib: mylib.c mylib.h
    gcc $(CFLAGS) -fpic -c mylib.c
    gcc -shared -o libmylib.so mylib.o

main_linked: main_linked.c mylib.h mylib.c
    gcc $(CFLAGS) -L. -lmylib main_linked.c -o main_linked

Примечание:

  1. mylib компилируется в общую библиотеку с -shared
  2. main_linked затем создается с помощью одного gcc вызова, передающего -lmylib, чтобы указать библиотеку для связи, и -L., чтобы указать, где ее найти (в данном случае - текущий каталог)
1 голос
/ 17 ноября 2011

Проверьте флаги -L и -l для g ++.

...