使用 Visual Studio C++ 2008 Express:
我正在尝试在编译如下的构建中执行最后的链接步骤:
使用开关静态编译库
foo.lib(构建不产生 a.dll) 。/MD构建foo.lib成功。文件和头.lib文件被发送到以下库的项目可以找到它们的目录。foo.lib源代码是用非托管 C++ 编写的。库
bar.dll被编译为带有/MD /LD开关的动态库。bar.dll取决于foo.lib导出的符号。两者bar.dll和都是使用来自 VS2008 Express 工具链的相同和二进制文件从foo.lib源代码构建的。源代码是用非托管 C++ 编写的。cl.exelink.exebar.dll构建的所有
.obj文件都bar.dll成功,但在最终执行期间link.exe会产生bar.dll,我收到数千个LNK2001关于未定义外部的错误。所有未定义的外部都是我希望在标准 C++ 库中出现的东西:诸如std::basic_string构造函数、std::_Throw类、ostream重载运算符等等。link.exe表示未定义的外部在内部未定义foo.lib!目标是
bar.dll在其中包含整个静态链接的代码foo.lib,以及它自己的对象,但动态地取决于运行时的存在/MSVCR90.dll解决MSVCP90.dll。
我是想用这个构建设置一个不可能的情况,还是我只是做错了什么?如果这在理论上根本行不通,请告诉我。foo.lib否则,请让我知道我可以尝试哪些诊断程序来确定为什么 C++ 库符号在最后的链接步骤中不可用。
编辑:更具体的信息:foo.lib是LLVM 3.1 并且bar.dll是libgl-gdi( )从分支llvmpipe构建的Mesamaster(目标是生成opengl32.dll在 上运行的llvmpipe)。我已经满足了所有构建依赖项,如下所示:
- LLVM 构建依赖于CMake作为构建系统和 Python 2.7。
- Mesa 构建依赖于SCons作为构建系统、LLVM 2.6 或更高版本、Python 2.7、pywin32、python-libxml2、bison 和 flex。除了上述之外,只有 LLVM 在运行时被运送;其余的只是构建过程中使用的“工具”。
我还根据需要为每个项目定制了构建,以设置环境变量并确保它们始终只使用/MD开关而不是使用/MT其他开关来选择错误的 C 运行时库。