【发布时间】:2012-09-04 23:04:38
【问题描述】:
我正在与客户共享一个静态库。 它使用的是 vs2008 sp 1。
我正在使用我用 mfc 构建的第三方库,带有共享 dll 和 /MD 选项发布版本
然后我构建了我自己的静态库,其中包括带有共享 dll 选项和 /MD 发布版本的 MFC 的第三方库。
我创建了一个测试 dll 来确保它正常工作。没有问题运行良好。 我根本没有使用 MFC。只有客户端是他们告诉我使用带有共享 dll 和 /MD 的 MFC 的原因。
现在他们抱怨他们得到了
xyz 已在 msvcrt.lib(MSVCR90.dll) 错误中定义。我认为这些看起来像 LNK2005 错误。
他们声明如下:
“由于“我的库”正在与较大的制造工具链构建中常见的许多库进行静态链接,因此具体链接失败。“我的库”正在导出这些常见的库函数,从而导致链接冲突。
他们还说:
“为了解决这个问题,“我的库”只能公开与单个 API(来自我的静态库)本身关联的函数,以保证不会导致链接冲突。导出的函数可以在“我的库”是使用链接器选项和模块定义(.def 文件)语句的组合构建的”
我不确定是什么导致了这个问题。这对我来说不是问题,但在那里。 我在想他们可能在使用不正确的选项或错误的 CRT 版本时遇到问题?
另外,我不确定我是否能满足他们可能不与 msvcrt.lib(MSVCR90.dll) 链接的要求,因为我的静态库确实依赖于标准 c 函数等。
我现在很迷茫,我确实研究了几个链接 How to distribute C run-time (CRT) Libraries
和
http://www.nuonsoft.com/blog/2008/10/29/binding-to-the-most-recent-visual-studio-libraries/
但是如果链接中说明了 CRT 的问题,那么我不确定如何弄清楚我在 vs2008 中使用的静态库是什么 CRT。我已经使用 /verbose 来查看它,但它不起作用。而且我知道dumpbin 或dependency walker 不会将它用于静态库。
为此苦苦挣扎了几天,并且疯狂地研究。没有关于为什么他们可能会遇到 msvcrt.lib(MSVCR90.dll) 问题的答案。
【问题讨论】:
-
他的设置和你的不匹配,他正在用 /MT 而不是 /MD 编译他的程序
-
你怎么知道的?有什么想法吗?
-
精神力量。错误消息也有点帮助。
-
从我读到的 /mt 使用 LIBCMT.lib 而 /md 使用 MSVCRT.lib。但是,由于我猜他们提供的消息不完整,因为我没有看到对 LIBCMT.lib 的任何引用,因此我无法建立连接。只是解释我的思考过程。可能是搞砸了。但我猜你是说如果他们对 msvcrt.lib(MSVCR90.dll) 有问题,那么这意味着他们正在使用 /MT?
标签: c++ visual-studio-2008 visual-c++ linker-errors lnk2005