使用Visual Studio C++ 2008 Express:
我试图在编译如下的构建中执行最后的链接步骤:
foo.lib
开关静态编译了库.dll
(构建不会产生/MD
)。 foo.lib
的构建成功。 .lib
文件和头文件传送到目录中,以下库的项目可以在其中找到它们。 foo.lib
源使用非托管C++编写。 bar.dll
开关将库/MD /LD
编译为动态库。 bar.dll
取决于foo.lib
导出的符号。 bar.dll
和foo.lib
都是使用VS2008 Express工具链中相同的cl.exe
和link.exe
二进制文件从源代码构建的。 bar.dll
源使用非托管C++编写。 .obj
的所有bar.dll
文件均已成功构建,但是在最终生成link.exe
的bar.dll
的执行过程中,我收到有关未定义外部组件的 的错误。我希望所有未定义的外部函数都存在于标准C++库中:诸如LNK2001
构造函数,std::basic_string
类,std::_Throw
重载运算符之类的东西。 ostream
表示未定义的外部在link.exe
中未定义! foo.lib
在其中包含bar.dll
的所有静态链接代码以及它自己的对象,但在运行时动态取决于foo.lib
和MSVCR90.dll
的存在/分辨率。 我是在尝试用此版本建立一个不可能的情况,还是我做错了什么?如果从理论上讲这根本行不通,请告诉我。否则,请让我知道我可以尝试进行哪些诊断,以确定为什么在最后的链接步骤中
MSVCP90.dll
无法使用C++库符号。编辑:更具体的信息:
foo.lib
是LLVM 3.1,而foo.lib
是bar.dll
分支中Mesa的libgl-gdi
(llvmpipe
)构建(目标是生成在master
上运行的opengl32.dll
)。我已经满足了所有的构建依赖性,如下所示:我还为每个项目定制了适当的设置,以设置环境变量,并确保它们始终使用
llvmpipe
开关,而不是/MD
或其他开关来选择错误的C运行时库。 最佳答案
从MSDN help:
更具体地说-此摘录:“使用此选项编译的应用程序静态链接到MSVCRT.lib”
换句话说,您需要将foo.lib链接到msvcrt.lib。
关于c++ - 构建时的Microsoft C++库符号链接(symbolic link),我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/11801673/