簡體   English   中英

使用 CMake ExternalProject 將預編譯庫集成到 C++ 代碼庫中

[英]Integrate pre-compiled libraries into C++ codebase with CMake ExternalProject

我想將CasADi作為ExternalProject集成到基於CMake的 C++ 代碼庫中。 為此,我想使用預編譯庫,因為不推薦從源代碼構建。 到目前為止,我只寫了以下內容:

ExternalProject_Add(
  casadi-3.5.5
  URL https://github.com/casadi/casadi/releases/download/3.5.5/casadi-linux-py39-v3.5.5-64bit.tar.gz
  CONFIGURE_COMMAND ""
  BUILD_COMMAND ""
  INSTALL_COMMAND ""
  PREFIX ${CMAKE_BINARY_DIR}/external/casadi)

我注意到所有二進制文件都已正確下載到指定文件夾中。 但是,我不知道如何將我的目標鏈接到CasADi ,也不知道如何找到 package。

ExternalProject_Add 有一個自然的問題:

ExternalProject_Add 僅在構建時執行命令。

因此,下載不會發生在項目的配置階段,這使得使用find_package變得困難,因為在第一次配置運行期間找不到文件。

以這個 CMakeLists.txt 為例:

cmake_minimum_required(VERSION 3.21)
project(untitled)

set(CMAKE_CXX_STANDARD 17)

add_executable(untitled main.cpp)

include(ExternalProject)
ExternalProject_Add(
        casadi-3.5.5
        URL https://github.com/casadi/casadi/releases/download/3.5.5/casadi-linux-py39-v3.5.5-64bit.tar.gz
        CONFIGURE_COMMAND ""
        BUILD_COMMAND ""
        INSTALL_COMMAND ""
        PREFIX ${CMAKE_BINARY_DIR}/external/casadi)

find_package(casadi HINTS ${CMAKE_BINARY_DIR}/external/casadi/src/casadi-3.5.5/casadi)

target_link_libraries(untitled casadi)

要使用它,您必須執行以下操作:

  1. 配置您的項目
mkdir build
cd build
cmake ..
  1. 構建(下載)casadi-3.5.5
cmake --build . --target casadi-3.5.5
  1. 重新配置你的項目,因為現在find_package會找到需要的文件
cmake ..
  1. 建立你的目標
cmake --build .

如果你想要一步構建,有辦法解決這個問題


下面是第二個選項的示例,它可能更好,因為 FetchContent 不具備 ExternalProject 的全部功能。

  • main.cpp
#include <casadi/casadi.hpp>

int main()
{
    casadi_printf("This works!");
    return 0;
}
  • CMakeLists.txt
cmake_minimum_required(VERSION 3.20)
project(untitled)

set(CMAKE_CXX_STANDARD 17)

# some default target
add_executable(untitled main.cpp)

# Configure and build external project
file(MAKE_DIRECTORY ${CMAKE_BINARY_DIR}/external)
execute_process(
        COMMAND ${CMAKE_COMMAND} ${CMAKE_SOURCE_DIR}/external
        WORKING_DIRECTORY ${CMAKE_BINARY_DIR}/external
)
execute_process(
        COMMAND ${CMAKE_COMMAND} --build ${CMAKE_BINARY_DIR}/external
)

# find and link externals
find_package(casadi REQUIRED HINTS ${CMAKE_BINARY_DIR}/external/external/casadi/src/casadi-3.5.5/casadi)
target_link_libraries(untitled casadi)
  • external/CMakeLists.txt
cmake_minimum_required(VERSION 3.20)
project(external)

include(ExternalProject)
ExternalProject_Add(
        casadi-3.5.5
        URL https://github.com/casadi/casadi/releases/download/3.5.5/casadi-linux-py39-v3.5.5-64bit.tar.gz
        CONFIGURE_COMMAND ""
        BUILD_COMMAND ""
        INSTALL_COMMAND ""
        PREFIX ${CMAKE_BINARY_DIR}/external/casadi)

重點是在external/CMakeLists.txt下有另一個 cmake 項目,它通過來自主 cmake 項目的execute_process調用進行配置和構建。 請注意,您現在可以在配置階段擁有find_package(casadi REQUIRED...) ,因為下載將在之前進行。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM