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

Com*_*fyS 3 c c++

我想声明一个foo()在静态库内部调用的函数,并在静态库中调用它.但是,我想强制应用程序的用户提供定义foo().这样的事情在C/C++中是可能的吗?

所以作为一个例子,想象一下这是静态库:

在foo.h中:

void foo();
Run Code Online (Sandbox Code Playgroud)

在foo.cpp中:

#include "foo.h"

int main() {
   foo();
   return 0;
}
Run Code Online (Sandbox Code Playgroud)

然后在使用此静态库的应用程序中:

在app.cpp中:

#include "foo.h"

void foo() {
    // Do something here...
}
Run Code Online (Sandbox Code Playgroud)

我想这必须是例如Win32 API对其WinMain()功能的作用,这实际上取代了通常的main().这怎么工作呢?在上面的例子静态库当然会不编译,由于undefined referencefoo().

Ben*_*igt 8

对的,这是可能的.你已经知道了.

你的困惑在于

由于"未定义的引用",静态库当然不能编译

但是"未定义的引用"不是编译错误 - 它是由链接器生成的.静态库只是一个未链接的编译对象文件集合.(加上可能是索引,因此链接器可以有效地找到它需要的目标文件而不扫描每个目标文件)

当链接器运行时,它将同时提供应用程序对象和库,并且不会解决任何问题.

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