如何添加第 3 方库以在 Windows cmd 上使用 g++ 构建?
How to add 3rd party libraries to build with g++ on Windows cmd?
我正在尝试使用 SDL 构建 C++ 应用程序。我的计划是静态 link 库,因此我不必处理 dll。 (我之前的问题: ). And I am following the steps from here: How can i statically link standard library to my c++ program?)
我可能必须以某种方式告诉编译器在哪里可以找到库,但我不知道该怎么做。
我试过了g++ -B <path> -c -Wall main.cpp
但它仍然抱怨找不到SDL.h(上面的路径指向包含SDL.h的文件夹)。
我从帮助菜单中寻找 -B 选项,但可能用错了。
我如何告诉编译器在哪里可以找到头文件,然后告诉linker,在哪里可以找到...如果有必要在这里做一些与库相关的事情,它需要找到什么点?
(您可能已经猜到了,我对手动构建项目和部署的了解非常有限,因此也欢迎任何来源。)
编译 C/C++ 代码是一个很大的话题,所以我绝对建议您也阅读这样的教程:https://www.geeksforgeeks.org/compiling-with-g-plus-plus/, and https://courses.cs.washington.edu/courses/cse373/99au/unix/g++.html.
但无论如何:
这是一个示例项目,它使用库 libFoo,并包含该库中的几个头文件:
Myproject:
- Main.cpp
- ClassFoo.cpp
- ClassFoo.hpp
ClassFoo.cpp的一部分:
#include "AClassFooHeader.hpp"
ClassFoo::myFunc() {
foo.execute(); // execute a random function in the libFoo library
}
现在假设我们要编译这个工程,需要执行什么命令?
所以第一部分是编译项目。基本上我们会将源文件转换为目标文件。之后我们将 link 它们一起放在一个应用程序中(连同一个库)。
假设我们 运行 这个命令:
g++ -c Main.cpp ClassFoo.cpp
我们将得到一个包含错误,如:"can't find AClassFooHeader.hpp"。
这是为什么?好吧,编译器在一些预定义的位置搜索头文件,但我们的库不在预定义的位置,所以它找不到头文件。我们如何解决这个问题?
g++ -I/path/to/lib/folderHeader -c Main.cpp ClassFoo.cpp
所以现在我们包含了文件的路径,所以编译器知道在哪里可以找到 AClassFooHeader.hpp
但现在我们还需要link将这些对象一起放在一个应用程序中。如果没有图书馆,这可以通过以下方式完成:
g++ -o application.exe Main.o ClassFoo.o
所以我们 link 应用程序中的 .o 文件(称为 application.exe)
但现在我们还需要 link 我们的图书馆。这可以通过以下方式完成:
g++ -o application.exe Main.o ClassFoo.o -L/path/to/lib/folderLibrary -lFoo
其中 -L 是库的存放位置,-l 是库名减去 lib,所以比如 libFoo -> -lFoo
这也可以一步完成:
g++ -o application.exe -I/path/to/lib/folderHeader Main.cpp ClassFoo.cpp -L/path/to/lib/folderLibrary -lFoo
我正在尝试使用 SDL 构建 C++ 应用程序。我的计划是静态 link 库,因此我不必处理 dll。 (我之前的问题:
我可能必须以某种方式告诉编译器在哪里可以找到库,但我不知道该怎么做。
我试过了g++ -B <path> -c -Wall main.cpp
但它仍然抱怨找不到SDL.h(上面的路径指向包含SDL.h的文件夹)。
我从帮助菜单中寻找 -B 选项,但可能用错了。
我如何告诉编译器在哪里可以找到头文件,然后告诉linker,在哪里可以找到...如果有必要在这里做一些与库相关的事情,它需要找到什么点?
(您可能已经猜到了,我对手动构建项目和部署的了解非常有限,因此也欢迎任何来源。)
编译 C/C++ 代码是一个很大的话题,所以我绝对建议您也阅读这样的教程:https://www.geeksforgeeks.org/compiling-with-g-plus-plus/, and https://courses.cs.washington.edu/courses/cse373/99au/unix/g++.html.
但无论如何:
这是一个示例项目,它使用库 libFoo,并包含该库中的几个头文件:
Myproject:
- Main.cpp
- ClassFoo.cpp
- ClassFoo.hpp
ClassFoo.cpp的一部分:
#include "AClassFooHeader.hpp"
ClassFoo::myFunc() {
foo.execute(); // execute a random function in the libFoo library
}
现在假设我们要编译这个工程,需要执行什么命令?
所以第一部分是编译项目。基本上我们会将源文件转换为目标文件。之后我们将 link 它们一起放在一个应用程序中(连同一个库)。
假设我们 运行 这个命令:
g++ -c Main.cpp ClassFoo.cpp
我们将得到一个包含错误,如:"can't find AClassFooHeader.hpp"。 这是为什么?好吧,编译器在一些预定义的位置搜索头文件,但我们的库不在预定义的位置,所以它找不到头文件。我们如何解决这个问题?
g++ -I/path/to/lib/folderHeader -c Main.cpp ClassFoo.cpp
所以现在我们包含了文件的路径,所以编译器知道在哪里可以找到 AClassFooHeader.hpp
但现在我们还需要link将这些对象一起放在一个应用程序中。如果没有图书馆,这可以通过以下方式完成:
g++ -o application.exe Main.o ClassFoo.o
所以我们 link 应用程序中的 .o 文件(称为 application.exe)
但现在我们还需要 link 我们的图书馆。这可以通过以下方式完成:
g++ -o application.exe Main.o ClassFoo.o -L/path/to/lib/folderLibrary -lFoo
其中 -L 是库的存放位置,-l 是库名减去 lib,所以比如 libFoo -> -lFoo
这也可以一步完成:
g++ -o application.exe -I/path/to/lib/folderHeader Main.cpp ClassFoo.cpp -L/path/to/lib/folderLibrary -lFoo