使用 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.exe
link.exe
bar.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 运行时库。