C++11和C++03之间的库兼容性问题

11

我正在使用g++-4.7和-std=c++0x开发一款C++11应用程序。
我的应用程序链接了一些使用g++-4.7编译的共享库,但没有使用-std=c++0x指令。

不幸的是,我在使用外部库类和方法时遇到了一些奇怪的行为。(当然,在没有-std=c++0x的情况下编译我的应用程序可以正常工作)。

  1. 这是一个预期的行为还是编译器错误?

  2. 是否有任何解决方法(类似于extern C关键字)?


1
为什么你不能使用-std=c++0x重新编译库? - leftaroundabout
4
如果您使用一个版本的库头文件编译一个翻译单元,而使用另一个版本的库头文件编译另一个翻译单元,则明显违反了所有翻译单元都应该看到相同代码的要求。 - Kerrek SB
1
使用不同的标志进行编译是通往疯狂的最短道路之一。对于警告和优化级别来说,这更或多或少还可以接受,但当它影响源代码的解释或生成的二进制文件的布局时...嗯。 - Matthieu M.
问题在于它是一个外部库(openscenegraph),在大多数发行版中都是预编译的。我只是在我正在使用的所有电脑上重新编译了它。 - sbabbi
1个回答

12

标准库已经发生了改变,编译器选项-std=c++0x将决定库的哪一部分被使用。如果在同一个程序中尝试使用这两个版本,您将违反单一定义规则 (对于标准库中每个已使用的元素,您有两个相同标识符的定义)。

我认为没有什么简单的方法可以克服这个限制。您必须确保只使用一个版本的库(即在包含标准头文件之前定义适当的宏以禁用C++11库内部),即使这样,我也不确定生成的代码是否仍会破坏ODR(如果C++11扩展以不同方式编译C++03库代码)。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接