【从零开始】coin-or/CoinUtils Osi Clp Cgl Cbc源码构建debug(CLion/CMake)

本文介绍了如何在Ubuntu20.04LTS环境下,利用CLion和CMake构建Cbc、Clp等COIN-OR项目。提供了两种方法:一种通过访问GitHub自动下载源码,另一种是预先下载源码zip文件。此外,还展示了如何设置CMakeLists.txt文件,并给出了源码调试的示例。

Cbc(Coin或branch and cut)是一个开源的混合整数线性规划求解器,用C++编写。它可以用作可调用库或使用独立的可执行文件。它可以通过各种建模系统、包等以多种方式使用。Clp(Coin或线性规划)是一个开源线性规划求解器。它主要是用来作为一个可调用的库,但也有一个基本的、独立的可执行版本。本文将介绍如何用CLion(CMake)构建工程并能debug源码。

相关教程

相关文献

CMake工程构建(能访问GitHub方法)

博主的环境是Ubuntu 20.04 LTS
首先打开CLion创建新工程:
在这里插入图片描述
修改CMakeLists.txt:

cmake_minimum_required(VERSION 3.21)
project(CbcProject)

set(PROJECT_ROOT_PATH "${PROJECT_SOURCE_DIR}")
# 可以把cbc打包后的.so文件放进lib目录下
set(LIBRARY_OUTPUT_PATH "${PROJECT_ROOT_PATH}/${OUTDIRS}/lib/")
# 可以把输出文件放进bin目录下
set(EXECUTABLE_OUTPUT_PATH "${PROJECT_ROOT_PATH}/${OUTDIRS}/bin/")
# Build Cbc dependencies.
set(BUILD_DEPS ON)

if (BUILD_DEPS)
    set(BUILD_CoinUtils ON)
    set(BUILD_Osi ON)
    set(BUILD_Clp ON)
    set(BUILD_Cgl ON)
    set(BUILD_Cbc ON)
endif ()

include(FetchContent)
# 填充期间的日志输出可能非常冗长,使得配置阶段非常嘈杂。此缓存选项(ON默认情况下)隐藏所有填充输出,除非遇到错误。如果遇到挂起下载的问题,
# 暂时关闭此选项可能有助于诊断导致问题的内容群体。
set(FETCHCONTENT_QUIET OFF)

# 避免每次下载编译及其所有依赖
get_filename_component(_deps "../_deps" REALPATH BASE_DIR "${CMAKE_BINARY_DIR}")
# 在大多数情况下,保存的详细信息没有指定与用于内部子构建、最终源和构建区域的目录相关的任何选项。通常最好将这些决定留给FetchContent 模块来代表项目处理。
# 缓存变量控制收集所有内容填充目录的FETCHCONTENT_BASE_DIR 点,但在大多数情况下,开发人员不需要更改它。
# 默认位置是${CMAKE_BINARY_DIR}/_deps,但如果开发人员更改此值,他们应该致力于保持路径短且刚好低于构建树的顶层,以避免在 Windows 上遇到路径长度问题。
set(FETCHCONTENT_BASE_DIR ${_deps})

# ##############################################################################
# Coinutils
# ##############################################################################
# Coin-OR does not support C++17/C++20 (use of 'register' storage class specifier)
set(CMAKE_CXX_STANDARD 11)

if (BUILD_CoinUtils)
    message(CHECK_START "Fetching CoinUtils")
    list(APPEND CMAKE_MESSAGE_INDENT "  ")
    FetchContent_Declare(
            CoinUtils
            GIT_REPOSITORY "https://github.com/Mizux/CoinUtils.git"
            GIT_TAG "cmake/2.11.6"
    )
    FetchContent_MakeAvailable(CoinUtils)
    list(POP_BACK CMAKE_MESSAGE_INDENT)
    message(CHECK_PASS "fetched")
endif ()

# ##############################################################################
# Osi
# ##############################################################################
if (BUILD_Osi)
    message(CHECK_START "Fetching Osi")
    list(APPEND CMAKE_MESSAGE_INDENT "  ")
    FetchContent_Declare(
            Osi
            GIT_REPOSITORY "https://github.com/Mizux/Osi.git"
            GIT_TAG "cmake/0.108.7"
    )
    FetchContent_MakeAvailable(Osi)
    list(POP_BACK CMAKE_MESSAGE_INDENT)
    message(CHECK_PASS "fetched")
endif ()

# ##############################################################################
# Clp
# ##############################################################################
if (BUILD_Clp)
    message(CHECK_START "Fetching Clp")
    list(APPEND CMAKE_MESSAGE_INDENT "  ")
    FetchContent_Declare(
            Clp
            GIT_REPOSITORY "https://github.com/Mizux/Clp.git"
            GIT_TAG "cmake/1.17.7"
    )
    FetchContent_MakeAvailable(Clp)
    list(POP_BACK CMAKE_MESSAGE_INDENT)
    message(CHECK_PASS "fetched")
endif ()

# ##############################################################################
# Cgl
# ##############################################################################
if (BUILD_Cgl)
    message(CHECK_START "Fetching Cgl")
    list(APPEND CMAKE_MESSAGE_INDENT "  ")
    FetchContent_Declare(
            Cgl
            GIT_REPOSITORY "https://github.com/Mizux/Cgl.git"
            GIT_TAG "cmake/0.60.5"
    )
    FetchContent_MakeAvailable(Cgl)
    list(POP_BACK CMAKE_MESSAGE_INDENT)
    message(CHECK_PASS "fetched")
endif ()

# ##############################################################################
# Cbc
# ##############################################################################
if (BUILD_Cbc)
    message(CHECK_START "Fetching Cbc")
    list(APPEND CMAKE_MESSAGE_INDENT "  ")
    FetchContent_Declare(
            Cbc
            GIT_REPOSITORY "https://github.com/Mizux/Cbc.git"
            GIT_TAG "cmake/2.10.7"
    )
    FetchContent_MakeAvailable(Cbc)
    list(POP_BACK CMAKE_MESSAGE_INDENT)
    message(CHECK_PASS "fetched")
endif ()

add_executable(${PROJECT_NAME} main.cpp)

if (BUILD_DEPS)
    set(COINOR_DEPS Coin::CbcSolver Coin::OsiCbc Coin::ClpSolver Coin::OsiClp)
    target_link_libraries(${PROJECT_NAME} PUBLIC ${COINOR_DEPS})
endif ()

然后你会看到:
在这里插入图片描述

CMake工程构建(不能访问GitHub方法)

博主的环境是Ubuntu 20.04 LTS
首先打开CLion创建新工程:
在这里插入图片描述
下载:coin-or/CoinUtils-cmake-2.11.6 Osi-cmake-0.108.7 Clp-cmake-1.17.7 Cgl-cmake-0.60.5 Cbc-cmake-2.10.7源码
解压到:
在这里插入图片描述
修改CMakeLists.txt:

cmake_minimum_required(VERSION 3.21)
project(CbcProject)

set(PROJECT_ROOT_PATH "${PROJECT_SOURCE_DIR}")
# 可以把cbc打包后的.so文件放进lib目录下
set(LIBRARY_OUTPUT_PATH "${PROJECT_ROOT_PATH}/${OUTDIRS}/lib/")
# 可以把输出文件放进bin目录下
set(EXECUTABLE_OUTPUT_PATH "${PROJECT_ROOT_PATH}/${OUTDIRS}/bin/")

# Build Cbc dependencies.
set(BUILD_DEPS ON)

if (BUILD_DEPS)
    set(BUILD_CoinUtils ON)
    set(BUILD_Osi ON)
    set(BUILD_Clp ON)
    set(BUILD_Cgl ON)
    set(BUILD_Cbc ON)
endif ()

include(FetchContent)
# 填充期间的日志输出可能非常冗长,使得配置阶段非常嘈杂。此缓存选项(ON默认情况下)隐藏所有填充输出,除非遇到错误。如果遇到挂起下载的问题,
# 暂时关闭此选项可能有助于诊断导致问题的内容群体。
set(FETCHCONTENT_QUIET OFF)

# 避免每次下载编译及其所有依赖
get_filename_component(_deps "../_deps" REALPATH BASE_DIR "${CMAKE_BINARY_DIR}")
# 在大多数情况下,保存的详细信息没有指定与用于内部子构建、最终源和构建区域的目录相关的任何选项。通常最好将这些决定留给FetchContent 模块来代表项目处理。
# 缓存变量控制收集所有内容填充目录的FETCHCONTENT_BASE_DIR 点,但在大多数情况下,开发人员不需要更改它。
# 默认位置是${CMAKE_BINARY_DIR}/_deps,但如果开发人员更改此值,他们应该致力于保持路径短且刚好低于构建树的顶层,以避免在 Windows 上遇到路径长度问题。
set(FETCHCONTENT_BASE_DIR ${_deps})

# ##############################################################################
# Coinutils
# ##############################################################################
# Coin-OR does not support C++17/C++20 (use of 'register' storage class specifier)
set(CMAKE_CXX_STANDARD 11)

if (BUILD_CoinUtils)
    message(CHECK_START "Fetching CoinUtils")
    list(APPEND CMAKE_MESSAGE_INDENT "  ")
    FetchContent_Declare(
            CoinUtils
            URL "${PROJECT_SOURCE_DIR}/deps/CoinUtils-cmake-2.11.6.zip"
    )
    FetchContent_MakeAvailable(CoinUtils)
    list(POP_BACK CMAKE_MESSAGE_INDENT)
   
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值