如何提供共享库,包括用于创建可执行文件的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(?!)
答案 0 :(得分:2)
问题似乎是您要将libMain.so
与main.so
关联起来并期望libMain.so
公开main.so
个符号。
我想到了两个解决方案:
libMain.so
与main.so
标记为-r
。 gcc -shared -r -o libMain.so main.so
。libMain.so
链接到main.o
(目标文件而不是.so
)。另一个注意事项是您应该使用g++
来编译和链接C ++代码。
答案 1 :(得分:2)
将main
功能放在共享库中没有任何技术上的错误,只要它以某种方式结束&#34;在&#34;最后的可执行文件它很奇怪,非传统,可能非常令人困惑,但从技术上来说,没有理由它不应该工作。
但你在这里有两个共享库 - libMain.so
和main.so
。除了与后者的联系之外,前者实际上并没有做任何事情。问题是共享库不包括&#34;另一个共享库 - 它只是扩展了依赖树。它没有&#34;包含&#34;任何功能。这些功能仍然只能在main.so
中找到。
因此,您的最终可执行文件也必须与main.so
相关联。
我建议完全丢失libMain.so
,因为它没有做任何事情。如果您使用gcc
(而不是g++
)来编译C ++代码,那么您将不会链接C ++标准库运行时,因此也要修复它。