5

我正在用 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 的答案)?

4

3 回答 3

3

对我来说,这听起来像是你想在你的World课堂上建立一个图书馆。库通常提供一堆类型或函数或变量,以供可执行文件或其他库链接/使用。

库通常由公共接口其余部分(内部、实现细节)组成。前者进入库头文件,阶梯进入其他头文件或实现文件。

接口定义包含库的潜在用户需要使用的所有内容。不多也不少。那是,

  • 公共类型、函数和变量的声明
  • 使用库所需的 typedef
  • 文件
  • ...

如果用户只需要与 the 交互World而不需要与 any交互,则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)

只需cmake使用所在目录的路径运行CMakeLists.txt以构建必要的makefile,然后运行make,然后您就应该完成了。


也可以看看:

于 2012-09-18T18:42:08.457 回答
1

您应该有一组必要的头文件供您的代码用户使用。其他所有东西都应该编译到一个库中供他们使用,以便他们将一组标头包含到他们的代码中并链接到库。

于 2012-09-18T17:47:57.467 回答
1

您可以创建静态或共享库。http://www.adp-gmbh.ch/cpp/gcc/create_lib.html

于 2012-09-18T17:49:48.353 回答