如何在 Windows 10 上使用 g++ 编写静态 C++ 库并将其 link 写入可执行文件?

How to write a static C++ library and link it to an executable using g++ on Windows 10?

main.cpp

#include <iostream>

int main() {
    std::cout << "main()" << std::endl;
    foo();
    return 0;
}

foo.cpp

#include <iostream>

extern "C" {
  void foo() {
      std::cout << "bar" << std::endl;
  }
}

编译静态库:

$ g++ foo.cpp -static

错误:

undefined reference to `WinMain'

但是这个编译:

$ g++ foo.cpp -shared -o foo.lib

现在我有一个名为 foo.lib 的静态库(据说)。

我尝试编译 link 的可执行文件:

$ g++ -L -lfoo main.cpp -o main.exe

并得到这个错误:

'foo' was not declared in this scope

但是 foo 是在我 link 使用的静态库中声明的。如果 link 有效,我认为我也不需要在 main.cpp 中声明它。那么为什么 link 不起作用?


更新。

我在 main.cpp 中添加了 void foo(); 所以它不会抱怨 foo 需要声明。

#include <iostream>

void foo();

int main() {
    std::cout << "main()" << std::endl;
    foo();
    return 0;
}

所以我再次尝试编译,但我得到了这个新错误:

undefined reference to `foo()'

为什么我需要在 main.cpp 中定义 foofoo.cpp里面已经定义好了,就是静态库。

如果我必须在 main.cpp 中定义 foo,那么 linking 到库 foo.lib.

更新

以下是您寻求的魔法咒语:

  • main.cpp
#include <iostream>
extern void foo();
int main() { 
  std::cout << "main()" << std::endl; 
  foo();
} 
  • foo.cpp
#include <iostream>
void foo() { 
  std::cout << "bar" << std::endl; 
}

控制台命令:

$ g++ -o foo.obj -c foo.cpp
$ ar rcs foo.lib foo.obj
$ g++ main.cpp foo.lib -o main.exe

这些咒语使静态库 foo 与可执行文件 main 静态链接到它。