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

时间:2016-08-10 17:21:06

标签: c++ linker ld

如何提供共享库,包括用于创建可执行文件的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;
}

这有效:

&GT; g ++ -o test1 test1.o main.so
因为main()在main.so中 但它在libMain.so(?!)

中不再可用

2 个答案:

答案 0 :(得分:2)

问题似乎是您要将libMain.somain.so关联起来并期望libMain.so公开main.so个符号。

我想到了两个解决方案:

  1. libMain.somain.so标记为-rgcc -shared -r -o libMain.so main.so
  2. libMain.so链接到main.o(目标文件而不是.so)。
  3. 另一个注意事项是您应该使用g++来编译和链接C ++代码。

答案 1 :(得分:2)

main功能放在共享库中没有任何技术上的错误,只要它以某种方式结束&#34;在&#34;最后的可执行文件它很奇怪,非传统,可能非常令人困惑,但从技术上来说,没有理由它不应该工作。

但你在这里有两个共享库 - libMain.somain.so。除了与后者的联系之外,前者实际上并没有做任何事情。问题是共享库不包括&#34;另一个共享库 - 它只是扩展了依赖树。它没有&#34;包含&#34;任何功能。这些功能仍然只能在main.so中找到。

因此,您的最终可执行文件也必须与main.so相关联。

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