【问题标题】:Compiling Bzip2 with C++11用 C++11 编译 Bzip2
【发布时间】:2015-03-29 20:42:53
【问题描述】:

我正在尝试使用 C++11 编译 MultiBoost Library,但我无法使其工作。问题似乎出在内部使用的 BZip2 库上。更具体地说,有一个名为 Bzip2Wrapper 的包装器来为 C 库提供 c++ 接口。 C 库的所有文件都包含在同一个文件夹中。使用默认 make 文件时一切正常,但当我更改时

project(multiboost)

到

project(multiboost CXX)

我收到以下错误:

libMultiBoostLib.a(Serialization.cpp.o): In function     `Bzip2WrapperReader::open(char const*)':
Serialization.cpp:(.text._ZN18Bzip2WrapperReader4openEPKc[_ZN18Bzip2WrapperReader4openEPKc]+0x97): undefined reference to `BZ2_bzReadOpen'
Serialization.cpp:(.text._ZN18Bzip2WrapperReader4openEPKc[_ZN18Bzip2WrapperReader4openEPKc]+0xc5): undefined reference to `BZ2_bzReadClose'
libMultiBoostLib.a(Serialization.cpp.o): In function `Bzip2WrapperReader::close()': ...

CMakeList 文件如下所示

# Bzip2
file(GLOB bzip2_SRCS "${BASEPATH}/Bzip2/*.cpp" "${BASEPATH}/Bzip2/*.c" "${BASEPATH}/Bzip2/*.h")
add_library(Bzip2Lib STATIC ${bzip2_SRCS})
#add_library(bzip2 SHARED ${bzip2_lib_SRCS})
...    
# adding library to the exec
target_link_libraries(multiboost MultiBoostLib Bzip2Lib)

有什么想法会出错吗?我什至不知道问题是什么。 谢谢!

【问题讨论】:

  • 这看起来不像我见过的任何 makefile。
  • @SamVarshavchik 项目好像在用CMake,这是现在常用的元构建系统。
  • 是的,我的意思是 CMakeList 文件,将更新问题。

标签: c++11 cmake bzip2 makefile


【解决方案1】:

这看起来不像是 C++11 错误,而是构建系统中的错误。

我没有查看代码,但是从输出中您添加了类似这样的内容

target_link_libraries(MultiBoostLib PUBLIC Bzip2Lib)

应该在 libBzip2Lib 上添加 libMultiBoostLib 中缺少的依赖项。

【讨论】:

    【解决方案2】:

    我发现了问题。我在我的项目描述中添加了“CXX”,这禁用了 C 的使用。因此无法编译库(在 C 中)。将其更改为“项目(名称 C CXX)”解决了这个问题。然后我还需要包含“set(CMAKE_CXX_FLAGS"${CMAKE_CXX_FLAGS} -std=c++11")”行以启用 C++11 支持。现在一切正常。

    非常感谢!

    【讨论】:

      猜你喜欢
      • 2020-09-14
      • 2012-05-08
      • 1970-01-01
      • 1970-01-01
      • 2017-10-27
      • 1970-01-01
      • 1970-01-01
      • 2016-03-14
      相关资源
      最近更新 更多