我不明白在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的目的是什么?
我有自己的代码,它依赖于第三方库,例如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在第一步建立步骤下载第三方库吗?
谢谢!
我想了解表达模板在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) 当我想在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) 我试着理解如何克服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) 我有与之前讨论相同的警告信息,但我不明白如何解决它:
警告: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)
你能解释一下这里的问题是什么吗?
我使用 CMake 来配置、构建和安装 C++ 代码。我已经定义了一些用户选项。我添加了一个选项,让 CMake 下载外部依赖项。等等等等。
目前,有关 CMake 的所有内容都写在单个文件 CMakeLists.txt 中。还有一个配置文件“config.cmake”,它允许用户定义各种参数,例如详细级别、库路径、编译器标志等。
什么是 CMake 的良好文件组织?CMakeLists.txt 文件是否应该分成子文件?
非常感谢您的帮助!
证明助手的主要功能是什么?
我只是想知道证明检查的内部逻辑。例如,有关此类助手的图形用户界面的主题使我不感兴趣。
对于编译器,我也提出了类似的问题:https : //softwareengineering.stackexchange.com/questions/165543/how-to-write-a-very-basic-compiler
我的担心是一样的,但对于校对系统。