拉帕克与助推器冲突

lapacke conflicting with boost?

本文关键字:冲突 助推器 帕克      更新时间:2023-10-16

如果我不包括<lapacke.h>,我会收到以下错误:

test.cpp:20:23: error: ‘LAPACK_ROW_MAJOR’ was not declared in this scope
     LAPACKE_dsyev(LAPACK_ROW_MAJOR, jobz, uplo, N, &a[0], lda, &work[0]);
                   ^
test.cpp:20:76: error: ‘LAPACKE_dsyev’ was not declared in this scope
     LAPACKE_dsyev(LAPACK_ROW_MAJOR, jobz, uplo, N, &a[0], lda, &work[0]);

但是,当我包含<lapacke.h>时,我得到了一长串与boost冲突的错误。我相信这与包括<boost/algorithm/string.hpp>有关,因为这是我使用的唯一boost项目。

是否存在与lapackeboost的已知冲突?当我省略<boost/algorithm/string.hpp>它编译得很好,但更广泛的代码依赖于该包含。

此问题的最小示例如下:

测试.h:

#include <lapacke.h>
#include <boost/algorithm/string.hpp>
#include <vector>

测试.cpp:

#include "test.h"
void eig( std::vector< double > A, std::vector< double >& evecs, std::vector< double >&evals ) { 
    int N = (int)A.size();
    if( N == 6 ) { 
        /// A is a 3x3 symmetric tensor
        char jobz = 'V';
        char uplo = 'L';
        int N = 3;
        int lda = 3;
        int lwork = 15; 
        double work[lwork];
        double a[9] = { 
            A[0], A[3], A[4],
            A[3], A[1], A[5],
            A[4], A[5], A[2]
        };  
        LAPACKE_dsyev(LAPACK_ROW_MAJOR, jobz, uplo, N, &a[0], lda, &work[0]);
        evals[0] = work[0];
        evals[1] = work[1];
        evals[2] = work[2];
        for(int i = 0; i < 9; i++) {
            evecs[i] = a[i];
        }   
    } else {
        fprintf(stderr, "ERROR: Unknown size of A in eign");
    }   
}
int main(int argc, char** argv) {

    return 0;
}

制作文件:

all: test.exe
CC=g++ -std=c++11
OPTS= -O3 -Wall
LIBS= -lm -L/usr/lib/lapack -llapacke -llapack -lblas -lcblas
test.exe: $(OBJS) test.cpp
    $(CC) $(OBJS) $(DEFS) $(OPTS) test.cpp -o test.exe $(LIBS)
clean:
    rm -rf *.o

似乎这可能对包含顺序很敏感。尝试先包含提升库,如下所示:

#include <boost/algorithm/string.hpp>
#include <lapacke.h>
#include <vector>

对我来说,它在此配置中编译并运行(但如果首先包含 lapacke,则不会编译)。