如何在 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 中定义 foo
? foo.cpp里面已经定义好了,就是静态库。
如果我必须在 main.cpp 中定义 foo
,那么 linking 到库 foo.lib.
更新
- 删除所有
extern "C" {
... }
行不会使“foo
未定义”错误消失。
以下是您寻求的魔法咒语:
- 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 静态链接到它。
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 中定义 foo
? foo.cpp里面已经定义好了,就是静态库。
如果我必须在 main.cpp 中定义 foo
,那么 linking 到库 foo.lib.
更新
- 删除所有
extern "C" {
...}
行不会使“foo
未定义”错误消失。
以下是您寻求的魔法咒语:
- 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 静态链接到它。