c++ - 在静态库中声明函数,在使用相同库的应用程序中定义它

标签 c++ c

我想在静态库中声明一个名为 foo() 的函数,并从静态库中调用它。但是,我想强制应用程序的用户提供 foo() 的定义。在 C/C++ 中可以实现类似的功能吗?

举个例子,假设这是静态库:

在 foo.h 中:

void foo();

在 foo.cpp 中:

#include "foo.h"

int main() {
   foo();
   return 0;
}

然后在使用这个静态库的应用中:

在 app.cpp 中:

#include "foo.h"

void foo() {
    // Do something here...
}

我想这一定是什么,例如Win32 API 使用它们的 WinMain() 函数,它基本上取代了通常的 main()。这是如何工作的?在上面的示例中,由于 foo()undefined reference,静态库当然不会编译。

最佳答案

是的,这是可能的。你已经知道怎么做了。

你的困惑在于

the static library would of course not compile, due to an "undefined reference"

但是“ undefined reference ”不是编译错误——它是由链接器生成的。静态库只是已编译目标文件的未链接集合。 (再加上一个索引,这样链接器就可以有效地找到它需要的目标文件,而无需扫描每个目标文件)

当链接器运行时,它会同时提供应用程序对象和库,并且不会留下任何 Unresolved 问题。

动态库是通过链接步骤创建的;静态库不是。

关于c++ - 在静态库中声明函数,在使用相同库的应用程序中定义它,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45869324/

相关文章:

c++ - extern"C"与 extern 的区别

c++ - 引用的直接初始化和复制初始化

c++ - 如何在Ubuntu中使用C++从/dev/xxx路径获取设备的USB VID、PID和序列号

c++ - 动态分配的字符串数组未能解除分配

c - STM32 USB CDC 操作

c - 用递归反转字符串的奇怪方法

c++ - MPI 内存分配

c - 变量声明与定义

c++ - 在析构函数中删除单链接列表的正确方法是什么?

c - 即使在 centos 7.3 中不存在 ExecStart 进程后,Systemd 服务状态仍保持运行