使用Visual Studio C++ 2008 Express:

我试图在编译如下的构建中执行最后的链接步骤:

  • 使用foo.lib开关静态编译了库.dll(构建不会产生/MD)。 foo.lib的构建成功。 .lib文件和头文件传送到目录中,以下库的项目可以在其中找到它们。 foo.lib源使用非托管C++编写。
  • 使用bar.dll开关将库/MD /LD编译为动态库。 bar.dll取决于foo.lib导出的符号。 bar.dllfoo.lib都是使用VS2008 Express工具链中相同的cl.exelink.exe二进制文件从源代码构建的。 bar.dll源使用非托管C++编写。
  • .obj的所有bar.dll文件均已成功构建,但是在最终生成link.exebar.dll的执行过程中,我收到有关未定义外部组件的 错误。我希望所有未定义的外部函数都存在于标准C++库中:诸如LNK2001构造函数,std::basic_string类,std::_Throw重载运算符之类的东西。 ostream表示未定义的外部link.exe中未定义!
  • 目标是foo.lib在其中包含bar.dll的所有静态链接代码以及它自己的对象,但在运行时动态取决于foo.libMSVCR90.dll的存在/分辨率。

  • 我是在尝试用此版本建立一个不可能的情况,还是我做错了什么?如果从理论上讲这根本行不通,请告诉我。否则,请让我知道我可以尝试进行哪些诊断,以确定为什么在最后的链接步骤中MSVCP90.dll无法使用C++库符号。

    编辑:更具体的信息:foo.libLLVM 3.1,而foo.libbar.dll分支中Mesalibgl-gdi(llvmpipe)构建(目标是生成在master上运行的opengl32.dll)。我已经满足了所有的构建依赖性,如下所示:
  • LLVM构建依赖于CMake作为构建系统以及Python 2.7。
  • Mesa构建依赖SCons作为构建系统,LLVM 2.6或更高版本,Python 2.7,pywin32,python-libxml2,bison和flex。除此之外,只有LLVM在运行时附带提供;其余只是构建过程中使用的“工具”。

  • 我还为每个项目定制了适当的设置,以设置环境变量,并确保它们始终使用llvmpipe开关,而不是/MD或其他开关来选择错误的C运行时库。

    最佳答案

    MSDN help:



    更具体地说-此摘录:“使用此选项编译的应用程序静态链接到MSVCRT.lib”

    换句话说,您需要将foo.lib链接到msvcrt.lib。

    关于c++ - 构建时的Microsoft C++库符号链接(symbolic link),我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/11801673/

    10-11 22:06
    查看更多