如何在Visual C ++ 2008中链接静态库?

时间:2009-06-14 00:14:27

标签: c++ visual-studio visual-c++

我的VC ++解决方案包括两个项目,一个应用程序(exe)和一个静态库。

两者编译都很好,但无法链接。我从我使用的静态库中获取每个函数的“未解析的外部符号”错误。它们看起来像这样:

MyApplication.obj:错误LNK2019:未解析的外部符号“__declspec(dllimport)int __cdecl MyStaticLibrary :: accept(int,struct sockaddr *,int *)”

应用程序发现.lib就好了,所以这不是问题。我认为“dllimport”是问题 - 为什么当我尝试构建静态库时会出现这种情况?应用程序和库都使用“多线程(/ MT)”运行时库,而不是“多线程DLL(/ MD)”。

修改

我认为有些答案是正确的。该库名为UDT,在主头文件中有这个:

#ifdef UDT_EXPORTS
   #define UDT_API __declspec(dllexport)
#else
   #define UDT_API __declspec(dllimport)
#endif

这是否意味着它不能用作静态库?

3 个答案:

答案 0 :(得分:3)

您是如何设置链接的?你的MyApplication和MyStaticLibrary :: accept的头文件是什么样的?

如果您在同一个解决方案文件中同时拥有这两个项目,则将其设置为链接的最佳方法是右键单击解决方案文件 - >属性,然后将库设置为应用程序的依赖项。 Visual Studio将自动处理链接,并确保在构建应用程序时库构建是最新的。

这个错误听起来有点像你在头文件中定义为DLL导入/导出。

编辑: 是的,这就是问题所在。您可能首先将其创建为动态库吗? (或者写过它的人。)

有几个选择。

1)您可以删除所有内容以及代码中的任何UDT_API修饰符。

2)你可以删除那些东西并添加这一行:

#define UDT_API

3)更强大的解决方案是将其更改为:

#ifdef  UDT_STATIC
    #define UDT_API
#else
    #ifdef UDT_EXPORTS
       #define UDT_API __declspec(dllexport)
    #else
       #define UDT_API __declspec(dllimport)
    #endif
#endif

如果要将预处理程序指令UDT_STATIC用作静态库,则将其添加到项目中,如果要将其用作动态库,请将其删除。 (需要添加到两个项目中。)

答案 1 :(得分:0)

由于您正在使用套接字,请确保在项目的其他依赖项中添加WS2_32.lib。

答案 2 :(得分:0)

看起来静态库中的导出函数具有错误的调用约定。导出函数的头文件如何?

好的,所以函数使用UDT_API作为前缀。如果你只是创建一个静态的.lib来链接它们,它们就不应该。

另一种方法是更改​​lib以创建一个dll。所以你用dll创建静态链接。唯一的问题是你必须提供你的应用程序的DLL。仍然不是一个糟糕的解决方案,因为它使您能够在lib中进行修复。