C++ 使用“时增压链路错误”--布局=系统“;关于VS2005

C++ 使用“时增压链路错误”--布局=系统“;关于VS2005,c++,boost,linker,C++,Boost,Linker,我是boost新手,我想尝试一下.dll的一些实际部署场景,因此我使用以下命令编译/安装库: .\bjam install --layout=system variant=debug runtime-link=shared link=shared --with-date_time --with-thread --with-regex --with-filesystem --includedir=<my include directory> --libdir=<my bin di

我是boost新手,我想尝试一下.dll的一些实际部署场景,因此我使用以下命令编译/安装库:

.\bjam install --layout=system variant=debug runtime-link=shared link=shared
--with-date_time --with-thread --with-regex --with-filesystem
--includedir=<my include directory> --libdir=<my bin directory> > installlog.txt
我确信.lib和.dll都在那个目录中,并且按照我的要求命名(例如:boost_regex.lib等,正如--layout=系统所说的,都是未版本的)。那么,它为什么要寻找它的版本类型呢?我怎样才能让它找到未版本的图书馆类型呢

我尝试了更多“正常”选项,例如:

.\bjam stage --build-type=complete --with-date_time --with-thread --with-filesystem --with-regex > mybuildlog.txt
这很好。我确保我的编译器看到了“stage\lib”目录,并且它编译并运行良好,除了让环境查看正确的lib目录外,没有其他任何问题。但当我拿走那些“测试”目录,并想使用其他目录(未版本)时,它失败了

我在XP上使用VS2005。有什么想法吗?< /P> < P>快速回答,因为我在家里不能访问Visual C++。 我相信你和Visual C++编译器上的“自动链接”发生了冲突。

解决方案是禁用“自动链接”(请参阅您的文档:快速谷歌搜索显示宏“BOOST_ALL_NO_LIB”以禁用所有BOOST库的自动链接),然后将您的项目明确链接到正确的库


我将尽快更新此答案。

我在构建时也遇到了这个奇怪的(对我来说)链接器错误 使用VS2005在Windows Server 2003上启动。我正在使用类似的
bjam
命令行选项与OP相同,但没有
--layout=system
选项,因为我不介意其中的版本信息(还没有)

下面的措辞的执行摘要是:如果你看到
链接:致命错误LNK1104:无法打开文件
“libboost_regex-vc80-mt-gd-1_42.lib”
,然后需要指定 与下游应用程序构建中的
-D
编译行选项相同 Boost的构建在构建Boost正则表达式库时进行。这个 文件中未说明AFAICT(截至2010年3月23日)

详细信息:调试此问题时我发现非常有用的内容有:

  • 在构建时,使用
    -d+2
    选项来
    bjam
    。这倒是一个错误 关于命令行选项到底是什么的大量日志记录 正在使用中。这就是我如何确定
    -DBOOST\u ALL\u NO\u LIB=1
    -DBOOST\u REGEX\u DYN\u LINK=1
    正在
    cl.exe
    在构建Boost正则表达式库时编译行

  • 请注意,您还必须提供相同的特殊
    -D
    标志 (使用VS2005同样接受的
    -D
    /D
    选项 当您在使用该文件的应用程序中编译
    .cpp
    文件时 boostlibrary(对于boostregex是真的,我猜这是真的 对于其他人,我尚未确认)。这就是为什么你会看到 链接器失败:
    LINK:致命错误LNK1104:无法打开文件
    “libboost_regex-vc80-mt-gd-1_42.lib”
    ,因为没有
    -DBOOST\u ALL\u NO\u LIB=1
    -DBOOST\u REGEX\u DYN\u LINK=1
    选项 当编译器解析你的
    .cpp
    文件和
    #包括
    的Boost头文件,后者是
    #包括
    的自动链接标题,后者由 默认使用自动链接逻辑,该逻辑是编译器杂注 告诉链接器要使用哪个库。猜猜是哪一个 自动链接逻辑在默认情况下会选择什么?答:静电 格式为
    libbla.lib
    且不为
    bla.lib
    这是您期望的导入库。这 基于pragma的链接器指令逻辑是我一直追求的目标 花了3个小时试图找出我在我的链接器上做错了什么 行,当它处于自动链接中的C预处理器控制下时 这样做的逻辑


  • 这是有效的,尽管现在我得到了一个共享的\u ptr错误(BOOST\u断言对于空指针是失败的)。我甚至一步一步地浏览了代码,不明白为什么有些东西没有初始化。可能是因为我编译了没有这个标志的库,并试图用它编译应用程序,但这仍然没有多大意义。无论如何,感谢您的帮助。实际上,我没有使用命令行选项,而是在boost\config中更改了user.hpp文件,因为这会在编译时影响bjam和您自己的应用程序。
    fatal error LNK1104: cannot open file 'libboost_regex-vc80-mt-1_42.lib'
    
    .\bjam stage --build-type=complete --with-date_time --with-thread --with-filesystem --with-regex > mybuildlog.txt