C ++:静态和动态库(编译和运行)

时间:2012-07-19 19:18:14

标签: c++ dll static compilation

我正在开展一个已经完成的图书馆项目。所以我现在正在试运行。我运行我的测试项目没有问题。但是我不能完全确定我是否正确行事。主要是因为我并不真正理解究竟发生了什么(至少我不完全确定)。

我已经编译了DLL和静态库(.a)。对于我的测试项目,我正在使用我的库中的Headers并链接到静态库。我能够编译。但是,似乎我还需要可执行文件所在的DLL才能运行它。

所以根据我的理解,我使用静态库进行编译,但我并没有将它完全嵌入到我的可执行文件中,因此在运行时它正在寻找DLL?

我的困惑来自于我读到静态库通常嵌入到可执行文件中的事实。但是,只有在编译器选项中指定它时才会发生这种情况吗?

我对我的关系中的关系感到困惑。有人可以澄清一下吗?

编辑: 我正在使用GCC。 Codelite作为我的IDE。

1 个答案:

答案 0 :(得分:1)

lib在编译时是静态的(在运行时无法动态链接)。所以你是正确的,lib是“嵌入”在可执行文件中。更准确地说,lib链接到编译器为生成exe文件而生成的其他目标文件。 lib无法链接到另一个lib,只有exe或dll可以链接到lib。

运行exe时,exe将动态链接

dll。 dll就像另一个exe,但它的入口函数是“dllmain”而不是“main”。 dll可以用lib构建,就像exe一样。 dll还可以在运行时链接到其他dll以与这些dll的功能接口。 dll的接口由def文件定义。

至于您的项目需要dll的原因,您可能需要检查项目中LoadLibrary的调用。