CLion、CMake和POCO

4

我是一个新手,对于C++和CMake不是很熟悉。我决定测试cLion和CMake。我正在尝试编写一个简单的命令行邮件客户端。其他来源告诉我,实现POP3和SMTP功能的最佳方法是使用POCO。不幸的是,CMake给了我麻烦。CLion附带的版本是3.2,但我的机器运行的版本是2.8。

~$ cmake --version
cmake version 2.8.12.2

第一个问题。我以为只需安装 POCO 并执行与我下载 openssl 时相同的操作即可绕过此问题。

cMakeList.txt:

cmake_minimum_required(VERSION 3.0)
project(Email_Reader)

set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++11")

#included paths for openssl and POCO. 

INCLUDE_DIRECTORIES("/usr/include/openssl")
INCLUDE_DIRECTORIES("/usr/local/include/Poco/Net")

set(SOURCE_FILES main.cpp)
add_executable(Email_Reader ${SOURCE_FILES}) 

POCO的文档告诉我至少需要3.0版本才能使用,但我感觉我的机器上有两个不同的cMake。请问您能帮我解决吗?


我在你的片段中没有看到任何特定于 cmake 3.0 的代码,因此将所需版本降低到2.8.12似乎值得一试。 - arved
Poco的cmake构建确实需要3.0版本。但是你也可以在没有cmake的情况下轻松地构建 Poco。 - Alex
问题在于我目前正在使用CLion,它只支持cMake构建来运行。我想既然这是我选择的IDE,那么我也应该学习一下cMake。 - gemini88mill
2个回答

13
您可以从以下网址获取最新的CMake版本:http://www.cmake.org/download/ 对于Linux系统,您可以从以下归档文件下载:http://www.cmake.org/files/v3.2/cmake-3.2.2.tar.gz 将提取的文件放入/opt/cmake/cmake-3.2,并在~/.bash_aliases中创建以下别名,这是一个使用它的简单方法:
alias ccmake3='/opt/cmake/cmake-3.2/bin/ccmake'
alias cmake3='/opt/cmake/cmake-3.2/bin/cmake'
alias cmake3-gui='/opt/cmake/cmake-3.2/bin/cmake-gui'
alias cpack3='/opt/cmake/cmake-3.2/bin/cpack'
alias ctest3='/opt/cmake/cmake-3.2/bin/ctest'

然后,确保您已经正确地构建和安装了POCO。 入门指南页面包含您进行此操作所需的所有信息。但是,基本上,您应该从这里获取源代码并将其解压缩到某个位置:

wget http://pocoproject.org/releases/poco-1.6.0/poco-1.6.0.tar.gz
tar xvfz poco-1.6.0.tar.gz
cd poco-1.6.0
mkdir -p cmake_build cmake_install/debug cmake_install/release
cd cmake_build
cmake3-gui ..
在 CMake 3 GUI 中,点击 Configure 按钮。在新窗口中,保持默认选项 Unix Makefiles 并点击 Finish 按钮。会出现一个错误消息(这是正常的),点击 Ok 按钮。
要构建 Debug 版本,请设置以下内容:
CMAKE_BUILD_TYPE     : Debug
CMAKE_INSTALL_PREFIX : the absolute path to "cmake_install/debug"

为了让您快速开始使用POCO,请取消除以下选项之外的所有选项,它们必须启用

ENABLE_JSON
ENABLE_NET
ENABLE_UTIL
ENABLE_XML
POCO_STATIC

(如果需要,您可以稍后考虑其他选项...)

退出GUI界面,然后构建/安装POCO:

make clean
make -j8
make install

现在,POCO应该已经安装在cmake_install/debug目录中了。要构建/安装其他版本,只需执行相同的过程,但将CMAKE_BUILD_TYPE中的Debug替换为ReleaseRelWithDebInfoMinSizeRel(参见CMake文档)(此外,您还需要更改安装目录)。

最后,您可以在C++项目中使用POCO。

例如,您的CMakeLists.txt应该如下所示:

cmake_minimum_required(VERSION 3.0)

project(Email_Reader)

# define the project
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++11")

set(SOURCE_FILES main.cpp)
add_executable(Email_Reader ${SOURCE_FILES}) 

# set the POCO paths and libs
set(POCO_PREFIX      "/path/to/cmake_install/debug") # the directory containing "include" and "lib"
set(POCO_INCLUDE_DIR "${POCO_PREFIX}/include")
set(POCO_LIB_DIR     "${POCO_PREFIX}/lib")
set(POCO_LIBS        "${POCO_LIB_DIR}/libPocoNetd.a"
                     "${POCO_LIB_DIR}/libPocoUtild.a"
                     "${POCO_LIB_DIR}/libPocoJSONd.a"
                     "${POCO_LIB_DIR}/libPocoXMLd.a"
                     "${POCO_LIB_DIR}/libPocoFoundationd.a"
                     "pthread")

# set the include path for the app
target_include_directories(Email_Reader PRIVATE "${POCO_INCLUDE_DIR}")
# link the app against POCO
target_link_libraries(Email_Reader "${POCO_LIBS}")

谢谢你帮我学习基础知识,现在是时候多读一些了,哈哈。 - gemini88mill
2
为什么你不使用Poco的find包呢? - sorosh_sabz

8

我用于使用Poco的CMakeLists.txt看起来像这样:

cmake_minimum_required(VERSION 3.10.0)
project(MyProject VERSION 0.1.0)


find_package(Poco REQUIRED COMPONENTS Foundation Net Zip )

add_executable(my_exe main.cpp)


target_link_libraries(my_exe PUBLIC Poco::Foundation Poco::Zip Poco::Net)

这个配置会自动添加必需的包含目录和库。
组件中的 Foundation 是必须的,看起来它提供了包含目录。
不要将 Poco 添加到 target_link_libraries 中,否则链接器将寻找 "Poco" 库。

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