【问题标题】:including itensor library in my cmake project in clion在我的 clion 的 cmake 项目中包括 itensor 库
【发布时间】:2017-04-13 16:15:59
【问题描述】:

所以我对 CLion 和 CMake 非常陌生,因此对于术语的错误使用提前表示歉意。我遇到以下问题:

在我的项目中,我想包含ITensor library,它本质上是一个非 CMake 项目。我将 git 克隆到我的计算机并构建 ITensor 项目。接下来我想在另一个项目中使用它,用 CMake 链接它:

我在 ma​​in.cpp 中的代码:

#include <iostream>
#include "itensor.h"

int main() {
    std::string some_string = "Hello world";
    return 0;
}

我的 CMakeLists.txt 看起来像:

cmake_minimum_required(VERSION 3.6)
project(tutorial)

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


set(ITENSOR_DIR PATH/TO/ITENSOR)
include_directories(ITENSOR_DIR/itensor)

set(SOURCE_FILES
        main.cpp
        ${ITENSOR_DIR}/itensor/itensor.h
        ${ITENSOR_DIR}/itensor/itensor.cc)

add_executable(tutorial ${SOURCE_FILES})

很遗憾,“教程”项目没有在 CLion 中构建。同样,CLion 无法解析依赖项 itensor.h。 有人知道为什么会这样,分别如何解决吗?

【问题讨论】:

    标签: cmake clion


    【解决方案1】:

    在尝试了 Thomas5631 的解决方案后,编译遇到了与 lapack 的链接问题。我通过添加一些标志解决了这个问题,但我不确定是否需要所有这些标志。

    我的 CMakeLists.txt:

    cmake_minimum_required(VERSION 3.6)
    project(my_project)
    #Bring the headers into the project (full or relative path)
    include_directories(itensor) 
    
    #Link the Itensor library
    add_library(itensor STATIC IMPORTED)
    set_property(TARGET itensor PROPERTY IMPORTED_LOCATION /home/david/my_project/itensor/lib/libitensor.a)
    
    #Set a variable with all the new flags
    set(ITENSOR_FLAGS "-DPLATFORM_lapack -D__ASSERT_MACROS_DEFINE_VERSIONS_WITHOUT_UNDERSCORES=0")
    set(ITENSOR_LINK_FLAGS "-DPLATFORM_lapack -L/home/david/my_project/itensor/lib -litensor -lpthread -L/usr/lib -lblas -llapack")
    
    #Append the new flags
    set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++11 ${ITENSOR_FLAGS}")
    
    add_executable(my_project main.cpp)
    target_link_libraries(my_project itensor "${ITENSOR_LINK_FLAGS}")
    

    动机:在文件夹itensor/project_template 中有一个简单的示例程序,可以用make(从终端)编译。编译的输出显示了标志:

    g++ -m64 -std=c++11 -c -I. -I/home/david/my_project/itensor -I/usr/include -O3 -DNDEBUG -Wall -DPLATFORM_lapack -D__ASSERT_MACROS_DEFINE_VERSIONS_WITHOUT_UNDERSCORES=0 -Wno-unused-variable -o myappname.o myappname.cc
    
    [... some warnings ...]
    
    g++ -m64 -std=c++11 -c -I. -I/home/david/my_project/itensor -I/usr/include -O3 -DNDEBUG -Wall -DPLATFORM_lapack -D__ASSERT_MACROS_DEFINE_VERSIONS_WITHOUT_UNDERSCORES=0 -Wno-unused-variable -o myclass.o myclass.cc
    g++ -m64 -std=c++11 -I. -I/home/david/my_project/itensor -I/usr/include -O3 -DNDEBUG -Wall -DPLATFORM_lapack -D__ASSERT_MACROS_DEFINE_VERSIONS_WITHOUT_UNDERSCORES=0 -Wno-unused-variable myappname.o myclass.o -o myappname -L/home/david/my_project/itensor/lib -litensor -lpthread -L/usr/lib -lblas -llapack
    

    【讨论】:

    • 不错的一个!这也消除了我对 Lapack 的问题!
    【解决方案2】:

    我通过以下 main.cpp 解决了这个问题:

    #include <iostream>
    #include "itensor/itensor.h"
    
    int main() {
        std::string some_string = "Hello world";
        return 0;
    }
    

    还有下面的CMakeLists.txt:

    project(tutorial)
    cmake_minimum_required(VERSION 3.6)
    set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++11")
    
    #Bring the headers into the project
    include_directories(/home/tom/Documents/workspace/ITensor/)
    
    #Link the library
    add_library(itensor STATIC IMPORTED)
    set_property(TARGET itensor PROPERTY IMPORTED_LOCATION /home/tom/Documents/workspace/ITensor/lib/libitensor.a)
    
    set(SOURCE_FILES  main.cpp)
    add_executable(tutorial ${SOURCE_FILES})
    

    ITensor 的路径可以是相对路径(使用 ${PROJECT_SOURCE_DIR} 变量)或绝对路径,如我所示。

    【讨论】:

    • 嗨,托马斯,太好了!感谢您的快速回复!现在它似乎可以工作了(这意味着我得到了另一个错误,但是这次与 lapack 相关联,因此不再涉及这篇文章:))。只是我认为您将 CMakeLists.txt 中的“项目(教程)”行交换到 main.cpp 中(可能只是在将复制粘贴到帖子中时)?
    猜你喜欢
    • 2020-11-09
    • 1970-01-01
    • 1970-01-01
    • 2018-03-17
    • 2016-12-25
    • 1970-01-01
    • 2021-09-15
    • 2020-07-17
    • 1970-01-01
    相关资源
    最近更新 更多