小编Ale*_*eph的帖子

什么是INSTALL_DIR在ExternalProject_Add命令中有用?

我不明白在ExternalProject_Add命令中使用INSTALL_DIR.我尝试使用它,但它似乎不起作用.这是一个CMakeLists.txt的示例,使用可快速编译的特征库:

cmake_minimum_required (VERSION 2.6)
project (example CXX)
include(ExternalProject)
include(ProcessorCount)
set(CMAKE_VERBOSE_MAKEFILE ON)
ProcessorCount(N)
if(NOT N EQUAL 0)
   set(CMAKE_BUILD_FLAGS -j${N})
endif()
ExternalProject_Add
(
    mylib
    PREFIX myprefix
    DOWNLOAD_COMMAND wget http://bitbucket.org/eigen/eigen/get/3.2.4.tar.gz && tar xvzf 3.2.4.tar.gz -C mylib --strip-components=1
)
Run Code Online (Sandbox Code Playgroud)

我选择了以下项目层次结构:

project
    CMakeLists.txt
    build/
Run Code Online (Sandbox Code Playgroud)

从构建存储库,我输入:

cmake ..
make
Run Code Online (Sandbox Code Playgroud)

安装过程失败,并显示以下消息:

文件无法创建目录:/ usr/local/include/eigen3.
也许需要管理权限.

据我所知,这意味着我需要在配置步骤中定义"前缀":

cmake -D CMAKE_INSTALL_PREFIX=$INSTALL_DIR ..
Run Code Online (Sandbox Code Playgroud)

但是,INSTALL_DIR变量已在ExternalProject_Add命令中定义.但是,当我通过添加修改INSTALL_DIR的值时,我得到相同的错误

INSTALL_DIR myprefix/src/install
Run Code Online (Sandbox Code Playgroud)

在ExternalProject_Add命令中.

那么,INSTALL_DIR对什么有用呢?我究竟做错了什么?

当然,我知道如何提供自己的配置命令来添加前缀并解决问题.但这不是我的问题.我的问题是:如果我必须这样做,INSTALL_DIR的目的是什么?

cmake external-project

13
推荐指数
1
解决办法
4770
查看次数

如何在编译源代码之前告诉CMake下载外部项目

我有自己的代码,它依赖于第三方库,例如yaml-cpp.我想在编译自己的源代码之前下载这些第三方库.但是,我无法用CMake做到这一点.

我设法下载yaml-cpp,如下所示:

ExternalProject_Add(yaml-cpp
                URL https://yaml-cpp.googlecode.com/files/yaml-cpp-0.5.1.tar.gz
                PREFIX ${CMAKE_CURRENT_BINARY_DIR}/yaml-cpp
                CMAKE_ARGS -DCMAKE_INSTALL_PREFIX:PATH=<INSTALL_DIR>
Run Code Online (Sandbox Code Playgroud)

但是当我打字的时候

cmake ..
make
Run Code Online (Sandbox Code Playgroud)

我的资料来源之前编译过.实际上,yaml-cpp是在最后一步下载的.

你知道如何告诉CMake在第一步建立步骤下载第三方库吗?

谢谢!

cmake

6
推荐指数
2
解决办法
2720
查看次数

Eigen中的表达模板

我想了解表达模板在Eigen中是如何工作的.我明白两个动态双向量的总和是由看起来像这样的东西执行的:

CwiseBinaryOp< internal::scalar_sum_op<double>, VectorXd const, VectorXd const > operator+(VectorXd const & lhs, VectorXd const & rhs);
Run Code Online (Sandbox Code Playgroud)

我也理解了如何实现两个向量的差异.

我有两个问题.

1.标量的矢量乘积如何工作?

我注意到

CwiseBinaryOp< internal::scalar_product_op<double>, VectorXd const, VectorXd const > 
Run Code Online (Sandbox Code Playgroud)

但我觉得它只是为了在两个向量之间执行分量运算而设计的.这是否意味着标量向量的乘积对应于一元运算符

CwiseUnaryOp< internal::scalar_product_op<double>, VectorXd const, VectorXd const > ?
Run Code Online (Sandbox Code Playgroud)

2.模板表达式可以通过混合操作构建吗?

例如,在表达式中

x = u + (2*v + (v-w))
Run Code Online (Sandbox Code Playgroud)

这些操作是否以这样的嵌套方式执行?

  • v-w 导致构建E1实例
  • 2*v 导致构建E2的实例
  • 2*v + (v-w) 导致构建E3实例
  • u + (2*v + (u-w)) 导致构建E4实例
  • x = u + (2*v + (v-w)) 电话

构造函数

VectorXd(E4 const &);
Run Code Online (Sandbox Code Playgroud)

或超载

VectorXd & operator=(E4 const &);
Run Code Online (Sandbox Code Playgroud)

它使用以下别名评估从前面的步骤构建的树:

using …
Run Code Online (Sandbox Code Playgroud)

eigen eigen3

6
推荐指数
1
解决办法
336
查看次数

多态性和pybind11

当我想在Python中使用C++多态时,我对pybind11有一个奇怪的行为.这是我的问题的一个简单示例:

import polymorphism as plm

a = plm.mylist()

print(a)

a[0].print()
a[1].print()
Run Code Online (Sandbox Code Playgroud)

这个脚本的输出是

[MyBase,MyDerived]

MyBase

MyBase

但预期的产出是

[MyBase,MyDerived]

MyBase

MyDerived

因为mylist返回一个std :: vector,它包含一个派生类(MyDerived)的实例作为第二个成员.奇怪的是,当我打印整个列表时,MyDerived被识别出来.

这是C++代码的头文件:

/* polymorphism.hpp */

#ifndef POLYMORPHISM_HPP
#define POLYMORPHISM_HPP

#include <vector>

class MyBase
{
  public:
    virtual void print() const;
};


class MyDerived : public MyBase
{
  public:
   virtual void print() const;
};


std::vector<MyBase*> mylist();

#endif
Run Code Online (Sandbox Code Playgroud)

这是cpp文件:

#include "polymorphism.hpp"

#include <iostream>
#include <pybind11/stl.h>
#include <pybind11/pybind11.h>

void MyBase::print() const
{ std::cout << "MyBase" << std::endl; }

void MyDerived::print() const
{ std::cout …
Run Code Online (Sandbox Code Playgroud)

c++ python pybind11

6
推荐指数
1
解决办法
312
查看次数

如何在GCC 5中处理双ABI?

我试着理解如何克服GCC 5中引入的双ABI的问题.但是,我没有设法做到这一点.这是一个重现错误的简单示例.我使用的GCC版本是5.2.如您所见,我的main函数(在main.cpp文件中)非常简单:

// main.cpp

#include <iostream>
#include <string>

int main()
{
    std::string message = "SUCCESS!";
    std::cout << message << std::endl;
}
Run Code Online (Sandbox Code Playgroud)

当我输入

/home/aleph/gcc/5.2.0/bin/g++ main.cpp
Run Code Online (Sandbox Code Playgroud)

我收到以下错误消息:

/tmp/ccjsTADd.o: In function `main':
main.cpp:(.text+0x26): undefined reference to `std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >::basic_string(char const*, std::allocator<char> const&)'
main.cpp:(.text+0x43): undefined reference to `std::basic_ostream<char, std::char_traits<char> >& std::operator<< <char, std::char_traits<char>, std::allocator<char> >(std::basic_ostream<char, std::char_traits<char> >&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&)'
main.cpp:(.text+0x5c): undefined reference to `std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >::~basic_string()'
main.cpp:(.text+0x8c): undefined reference to `std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >::~basic_string()'
collect2: erreur: ld a retourné …
Run Code Online (Sandbox Code Playgroud)

c++ gcc c++11 c++14

4
推荐指数
1
解决办法
4138
查看次数

有关太多模板标题的警告

我有与之前讨论相同的警告信息,但我不明白如何解决它:

警告:foo <1> :: value(应为0)的模板头太多int const foo <1> :: value = 1;

当想要使用以下玩具标题时,会出现警告消息:

#ifndef FOO
#define FOO

template<int T>
struct foo;

template<>
struct foo<1>
{ static int const value; };

template<>
int const foo<1>::value = 1;

#endif
Run Code Online (Sandbox Code Playgroud)

你能解释一下这里的问题是什么吗?

c++ c++14

4
推荐指数
1
解决办法
139
查看次数

CMake 的哪个文件组织?CMakeLists.txt 是否应该包含其他文件?

我使用 CMake 来配置、构建和安装 C++ 代码。我已经定义了一些用户选项。我添加了一个选项,让 CMake 下载外部依赖项。等等等等。

目前,有关 CMake 的所有内容都写在单个文件 CMakeLists.txt 中。还有一个配置文件“config.cmake”,它允许用户定义各种参数,例如详细级别、库路径、编译器标志等。

什么是 CMake 的良好文件组织?CMakeLists.txt 文件是否应该分成子文件?

非常感谢您的帮助!

cmake

1
推荐指数
1
解决办法
921
查看次数

证明助手如何实施?

证明助手的主要功能是什么?

我只是想知道证明检查的内部逻辑。例如,有关此类助手的图形用户界面的主题使我不感兴趣。

对于编译器,我也提出了类似的问题:https : //softwareengineering.stackexchange.com/questions/165543/how-to-write-a-very-basic-compiler

我的担心是一样的,但对于校对系统。

proof coq isabelle

1
推荐指数
1
解决办法
120
查看次数

标签 统计

c++ ×3

cmake ×3

c++14 ×2

c++11 ×1

coq ×1

eigen ×1

eigen3 ×1

external-project ×1

gcc ×1

isabelle ×1

proof ×1

pybind11 ×1

python ×1