【发布时间】:2018-11-26 14:53:19
【问题描述】:
我写了一个代码来直接读取压缩文件。我必须使用 Cmake 构建它。这是我唯一的源文件,uncompress.cpp
#include <iostream>
#include <vector>
#include <boost/iostreams/filtering_stream.hpp>
#include <boost/iostreams/filter/bzip2.hpp>
// cl /EHsc uncompress.cpp
std::vector<char> & readline(std::istream & stream, std::vector<char> & container) {
char c;
container.clear();
while (stream && stream.get(c)) {
container.push_back(c);
if (c == '\n') break;
}
return container;
}
int main () {
boost::iostreams::filtering_istream in;
boost::iostreams::filtering_istream cinn(std::cin);
in.push(boost::iostreams::bzip2_decompressor());
in.push(cinn);
std::vector<char> line;
while (readline(in, line).size() != 0) {
std::string str(line.begin(), line.end());
std::cout << "--" << str ;
}
}
我的 CMakeLists.txt 包括
cmake_minimum_required (VERSION 2.8.9)
project (reader-demo CXX C)
find_package (Boost COMPONENTS iostreams zlib REQUIRED)
include_directories (${Boost_INCLUDE_DIR} )
add_executable(reader uncompress.cpp)
target_link_libraries(reader ${Boost_LIBRARIES})
我的 cmake 命令是:
cmake -G "NMake Makefiles" .
这会抛出错误 boost_zlib not found during cmake
找不到以下 Boost 库:
boost_zlib
我已正确设置所有路径中内置的以下 zlib 库:
注意 如果我将 CMakeLists.txt 更改为此。它工作正常。但我不明白如何:/
cmake_minimum_required (VERSION 2.8.9)
project (reader-demo CXX C)
add_executable(reader uncompress.cpp)
它按预期工作正常。 reader.exe 是 make 并且运行良好。
我的问题是:为什么我在 cmake 中提到它时找不到 boost_zlib,为什么当我删除 target_link_libraries() 时它工作正常。
【问题讨论】:
-
您找到的库是静态库而不是 DLL。要使用静态库,您需要将
set(Boost_USE_STATIC_LIBS ON) set(Boost_USE_MULTITHREADED ON)添加到您的CMakeLists.txt 文件之前find_package(Boost ...)调用。并且您应该将-DBOOST_ROOT=<path_to_your_Boost_installation>添加到您的 CMake 命令行调用中,以确保无论非标准安装目录如何都能找到 Boost。 -
顺便说一句,您在 Boost 1.67 中使用的是哪个版本的 CMake?
-
我的 cmake 版本是 3.11.2 @vre
-
在对
CMakeLists.txt进行更改后,您是否总是删除CMakeCache.txt文件? Boost 搜索的值缓存在 CMake 中,您不会直接在 cpp 文件中引用任何与 boost_zlib 相关的内容。这可能是它在第二次调用中起作用的原因。 -
zlib 不是已注册的 Boost 组件,尽管 boost_iostreams 库的 Boost 构建过程会生成 boost_zlib 和 boost_bzip2 库。所以 FindBoost.cmake 不知道这些(它们是内部的)。
标签: c++ visual-c++ boost cmake