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.so
与 main.so
链接起来,并期望 libMain.so
公开 main.so
符号。
想到了两个解决方案:
- Link
libMain.so
到 main.so
带有 -r
标志。 gcc -shared -r -o libMain.so main.so
.
- Link
libMain.so
到main.o
(目标文件而不是.so
)。
另一个注意事项是您应该使用 g++
来编译和链接 C++ 代码。
将 main
函数放在共享库中在技术上没有任何问题,只要它以某种方式结束 "in" 您的最终可执行文件。它很奇怪,非常规,而且可能非常令人困惑,但从技术上讲,它没有理由不工作。
但是您这里有 两个 共享库 - libMain.so
和 main.so
。前者除了 link 对后者实际上什么都不做。问题是共享库没有 "include" 另一个共享库——它只是扩展了依赖关系树。它没有 "contain" 任何功能。这些功能仍然只在 main.so
.
中找到
因此,您的最终可执行文件也必须 link 反对 main.so
。
我建议完全失去 libMain.so
,因为它没有做任何事情。如果你使用 gcc
(而不是 g++
)来编译 C++ 代码,你将不会 linking C++ 标准库运行时,所以也要修复它。
我如何提供一个 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.so
与 main.so
链接起来,并期望 libMain.so
公开 main.so
符号。
想到了两个解决方案:
- Link
libMain.so
到main.so
带有-r
标志。gcc -shared -r -o libMain.so main.so
. - Link
libMain.so
到main.o
(目标文件而不是.so
)。
另一个注意事项是您应该使用 g++
来编译和链接 C++ 代码。
将 main
函数放在共享库中在技术上没有任何问题,只要它以某种方式结束 "in" 您的最终可执行文件。它很奇怪,非常规,而且可能非常令人困惑,但从技术上讲,它没有理由不工作。
但是您这里有 两个 共享库 - libMain.so
和 main.so
。前者除了 link 对后者实际上什么都不做。问题是共享库没有 "include" 另一个共享库——它只是扩展了依赖关系树。它没有 "contain" 任何功能。这些功能仍然只在 main.so
.
因此,您的最终可执行文件也必须 link 反对 main.so
。
我建议完全失去 libMain.so
,因为它没有做任何事情。如果你使用 gcc
(而不是 g++
)来编译 C++ 代码,你将不会 linking C++ 标准库运行时,所以也要修复它。