我如何提供一个包含 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 中不再可用(?!)
最佳答案
将 main
函数放在共享库中在技术上没有任何问题,只要它以某种方式最终“进入”您的最终可执行文件即可。它很奇怪、非常规,而且可能非常令人困惑,但从技术上讲,没有理由认为它不起作用。
但是您这里有两个共享库 - libMain.so
和 main.so
。前者除了链接到后者之外实际上什么都不做。问题是共享库不会“包含”另一个共享库——它只是扩展了依赖树。它不“包含”任何功能。这些函数仍然只能在 main.so
中找到。
因此,您的最终可执行文件也必须链接到 main.so
。
我建议完全丢失 libMain.so
,因为它什么也没做。如果您使用 gcc
(而不是 g++
)编译 C++ 代码,您将不会链接 C++ 标准库运行时,因此也请修复它。
关于c++ - 将带有 main() 的共享库链接到仅提供处理函数的可执行文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38879807/