假设我有一个静态的C ++库,static.lib,并且我想从一个C ++共享库,比如shared.lib中调用一些函数。这是否可行?
现在假设我有另一个共享库,比如shared2.lib,它链接到static.lib但不链接到shared.lib。在这种情况下,连接器是否会自动将shared2.lib链接到shared.lib?
我正在使用Microsoft Visual Studio 2003。
假设我有一个静态的C ++库,static.lib,并且我想从一个C ++共享库,比如shared.lib中调用一些函数。这是否可行?
现在假设我有另一个共享库,比如shared2.lib,它链接到static.lib但不链接到shared.lib。在这种情况下,连接器是否会自动将shared2.lib链接到shared.lib?
我正在使用Microsoft Visual Studio 2003。
静态库不是被链接的,它们只是一组目标文件(*.obj或*.o)的归档集合,存储在一个库文件中(类似于tar / zip文件),以便链接器更容易地找到它所需的符号。
静态库可以调用未定义的函数(但仅在头文件中声明),因为它只是编译。然后,当您链接使用静态库的exe或dll时,您将需要链接提供从静态库中调用但未在其中定义的函数的另一个库。
如果您想让链接器自动链接其他库,Stephen的建议很有效,并且像boost和stlport这样的著名库也在使用。要做到这一点,请在静态库的主头文件中放置pragma。您应该包含静态库及其依赖项。
不过,我认为这个特性实际上是为库编写者而设计的,在系统库路径中的库将更容易被链接器找到。此外,在boost和stlport的情况下,它们使用该功能来支持具有 #define 选项定义的同一库的多个版本,其中不同的选项需要链接不同版本的库。这意味着用户不太可能以一种方式配置boost并链接已配置另一种方式的库。
对于应用程序代码,我的偏好是显式链接所需的部分。