c++ - 将带有 main() 的共享库链接到仅提供处理函数的可执行文件

标签 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;
}

这个有效:

> g++ -o test1 test1.o main.so
因为 main() 在 main.so 中 但它在 libMain.so 中不再可用(?!)

最佳答案

main 函数放在共享库中在技术上没有任何问题,只要它以某种方式最终“进入”您的最终可执行文件即可。它很奇怪、非常规,而且可能非常令人困惑,但从技术上讲,没有理由认为它不起作用。

但是您这里有两个共享库 - libMain.somain.so。前者除了链接到后者之外实际上什么都不做。问题是共享库不会“包含”另一个共享库——它只是扩展了依赖树。它不“包含”任何功能。这些函数仍然只能在 main.so 中找到。

因此,您的最终可执行文件也必须链接到 main.so

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

关于c++ - 将带有 main() 的共享库链接到仅提供处理函数的可执行文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38879807/

相关文章:

c++ - 如何在可执行共享库 (.so) 中触发全局变量的 c'tors?

c++ - undefined reference 但(动态)库已链接。 (可能是 bad reloc address error)

gcc - 在编译期间告诉 ld 在哪里寻找依赖的共享库

c - 在 Windows 上为 Haskell 构建 GD 库时出现 ld 错误

C++如何定义嵌套类中的运算符

c++ - gcc code::blocks 共享库问题

c++ - 为什么指向 int 的指针转换为 void* 而指向函数的指针转换为 bool?

c - 链接器无法找到其他静态库中的函数

C++、段错误和内存管理

c++ - 使用 STL 算法缓存复杂的比较函数?