Link 与 main() 共享库到仅提供处理函数的可执行文件

Link shared library with main() to executables providing a handler function only

我如何提供一个 shared 库,包括用于创建可执行文件的 main() 例程,它只提供一个 handler() 例程?

frank@frank-M470-2:/media/Workspace/eclipse/libMain$ cat Makefile

main.so: main.cpp
    gcc -shared -o main.so -fPIC main.cpp

libMain.so: main.so
    gcc -shared -o libMain.so main.so

test1:  libMain.so test1.o
    g++ -o test1 test1.o -L. -lMain

test2:  libMain.so test2.o
    g++ -o test2 test2.o -L. -lMain

all: test1 test2

clean:
    rm -f test1 test2 libMain.so *.o *.so

frank@frank-M470-2:/media/Workspace/eclipse/libMain$ cat main.cpp

void DoSomething(void);

int main(int, char **)
{
   DoSomething();
   return 0;
}

frank@frank-M470-2:/media/Workspace/eclipse/libMain$ cat test1.cpp
#include <iostream>

void DoSomething(void)
{
  std::cout << "hello from test1" << std::endl;
}

frank@frank-M470-2:/media/Workspace/eclipse/libMain$ cat test2.cpp
#include <iostream>

void DoSomething(void)
{
  std::cout << "hello from test2" << std::endl;
}

这个有效:

> g++ -o test1 test1.o main.so
因为 main() 在 main.so 但它在 libMain.so (?!)

中不再可用

问题似乎是您将 libMain.somain.so 链接起来,并期望 libMain.so 公开 main.so 符号。

想到了两个解决方案:

  1. Link libMain.somain.so 带有 -r 标志。 gcc -shared -r -o libMain.so main.so.
  2. LinklibMain.somain.o(目标文件而不是.so)。

另一个注意事项是您应该使用 g++ 来编译和链接 C++ 代码。

main 函数放在共享库中在技术上没有任何问题,只要它以某种方式结束 "in" 您的最终可执行文件。它很奇怪,非常规,而且可能非常令人困惑,但从技术上讲,它没有理由不工作。

但是您这里有 两个 共享库 - libMain.somain.so。前者除了 link 对后者实际上什么都不做。问题是共享库没有 "include" 另一个共享库——它只是扩展了依赖关系树。它没有 "contain" 任何功能。这些功能仍然只在 main.so.

中找到

因此,您的最终可执行文件也必须 link 反对 main.so

我建议完全失去 libMain.so,因为它没有做任何事情。如果你使用 gcc(而不是 g++)来编译 C++ 代码,你将不会 linking C++ 标准库运行时,所以也要修复它。