我正在用 C++ 构建一个进化模拟器,但不是作为“真正的”可运行程序,而是其他程序应该 #include
的类。这个名为World
的类具有一些函数,例如update()
、getInfo()
等...
我在这里面临两个问题。首先,我不知道我究竟应该如何编译这个类,以及我应该为用户程序(#include
类)提供哪些文件。显然,程序应该接收.hpp
文件,但还有什么呢? World
类的对象文件?这意味着我需要使用 g++ World.o user.o -o user
语法编译用户程序,但有没有办法避免这样做(提到 World. o
在我的编译命令中)?同样,我不需要在编译命令中包含 iostream.o
。
第二个问题是 World
类 #include
的一些其他类,例如 Organism
,反过来,必须包含 Block
类以便从它继承。我如何编译此代码以获得单个 World.o
文件(如果这是问题 1 的答案)?
最佳答案
对我来说,这听起来像是您想从您的 World
类中创建一个库。库通常提供一堆类型、函数或变量,以链接到可执行文件或其他库或由其使用。
库通常由公共(public)接口(interface) 和其余部分(内部、实现细节)组成。前者进入库头文件,阶梯进入其他头文件或实现文件。
接口(interface)定义包含库的潜在用户需要使用的所有内容。不多也不少。也就是说,
- 公共(public)类型、函数和变量的声明
- 使用库所需的 typedef
- 文档
- ...
如果用户只需要与 World
交互而不需要与任何 Organism
交互,则此类不会进入库头,例如仅包含在相关的实现文件。实现本身可以分成不同的文件。由链接器适本地组合这些。
当涉及大量文件和库时,手动定义构建配置可能会很麻烦。好东西,有工具可以自动生成它。 例如cmake .示例 cmake 配置文件可能如下所示:
# CMakeLists.txt
# add a shared library to build configuration
add_library(my_library_name SHARED my_library_file1.cpp my_library_file2.cpp)
# add an executable to build configuration
add_executable(my_executable_name executable_file1.cpp executable_file2.cpp)
# link the library to the executable
target_link_libraries(my_executable_name my_library_name)
只需使用 CMakeLists.txt
所在目录的路径运行 cmake
即可构建必要的 makefile,然后运行 make
,那么你应该完成了。
另见:
关于c++ - 使一个类可用于其他程序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12482265/