我正在尝试使用SDL构建C ++应用程序。我的计划是静态链接库,因此我不必处理dll。 (我之前的问题:Where do one start on deploying C++ code?)。我正在从这里进行以下操作:How can i statically link standard library to my c++ program?)
我可能必须以某种方式告诉编译器在哪里可以找到库,但是我不知道该怎么做。
我尝试过g++ -B <path> -c -Wall main.cpp
但是它仍然抱怨找不到SDL.h(上面的路径指向包含SDL.h的文件夹)。
我从帮助菜单中寻找-B选项,可能使用了错误的选项。
我如何告诉编译器在哪里可以找到头文件,然后在链接器上可以找到...无论需要什么,现在是否需要做与库相关的事情?
((您可能已经猜到了,我对手动构建项目和部署的知识非常有限,因此任何来源也都值得赞赏。)
编译C / C ++代码是一个很大的话题,因此,我绝对建议您也阅读这样的教程:https://www.geeksforgeeks.org/compiling-with-g-plus-plus/和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
}
现在假设我们要编译该项目,需要执行什么命令?
因此,第一部分是编译项目。基本上,我们会将源文件转换为目标文件。之后,我们将它们链接到一个应用程序中(连同一个库)。
假设我们运行此命令:
g++ -c Main.cpp ClassFoo.cpp
我们将收到一个包含错误,例如:“找不到AClassFooHeader.hpp”。这是为什么?好的,编译器会在一些预定义的位置搜索头文件,但是我们的库不在预定义的位置,因此找不到头文件。我们该如何解决?
g++ -I/path/to/lib/folderHeader -c Main.cpp ClassFoo.cpp
所以现在我们包含了文件的路径,因此编译器知道在哪里可以找到AClassFooHeader.hpp
但是现在我们还需要在应用程序中将对象链接在一起。没有库,可以使用以下方法完成:
g++ -o application.exe Main.o ClassFoo.o
因此,我们将.o文件链接到应用程序(称为application.exe)中
但是现在我们还需要链接我们的库。这可以通过以下方式完成:
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