c++ - 影响 Makefile 中其他库的库

标签 c++ c makefile mosek

我在下面的 Makefile 中遇到了一个奇怪的问题:

# Mosek path
MOSEKPATH = /autofs/fs1.ece/fs1.eecg.najm/b/b1/power_grid_code/mosek

# Include paths
INCPATHS = -I$(MOSEKPATH)/7/tools/platform/linux64x86/h -I/usr/include/suitesparse -I../include

# Libraries paths
LIBPATHS = -L$(MOSEKPATH)/7/tools/platform/linux64x86/bin

# Link libraries
LIBS = -lboost_timer-mt -lboost_system -lumfpack -lamd -lcolamd -lcholmod -lccolamd -lcamd -lbtf -lcsparse -lcxsparse -lklu -lldl -lspqr -llapack -lblas
MOSEKLIB = -lmosek64
LDOPT = -Wl,-rpath-link,$(MOSEKPATH)/7/tools/platform/linux64x86/bin -Wl,-rpath,'/autofs/fs1.ece/fs1.eecg.najm/b/b1/power_grid_code/mosek/7/tools/platform/linux64x86/bin' -pthread -lc -lm

# Specify compiler
CC = g++-4.7 -m64

# Compiler flags
FLAGS = -O3 -Wall -g

lo1: lo1.c
    $(CC) $(FLAGS) -c $(INCPATHS)          -o lo1.o lo1.c
    $(CC) $(FLAGS) $(LIBPATHS) lo1.o $(LIBS) $(MOSEKLIB) $(LDOPT) -o lo1 

clean:
    rm -f lo1 *.o 

我从MOSEK提供的例子中得到了大部分内容. Makefile 工作正常,结果符合预期。问题是,我使用的 MOSEK 版本是多线程的 (MOSEK 7.1)。 MOSEK 应该检测机器上的内核数量,并使用所有内核。当我按原样使用 Makefile 时,MOSEK 只检测到一个核心,并且只使用一个线程:

Computer
  Platform               : Linux/64-X86    
  Cores                  : 1              

但是,当我在没有 $(LIBS) 的情况下编译时,MOSEK 确实检测到 4 个内核:

Computer
  Platform               : Linux/64-X86    
  Cores                  : 4               

我在 lo1.c 中的代码目前不使用 $(LIBS),但稍后我将在 lo1.c 中需要这些库。为什么这些库会影响 MOSEK 的行为?

谢谢。

最佳答案

原来是BLAS的问题。 SuiteSparse 中的一些库需要 BLAS,而服务器上的 BLAS 库会与 OpenMP 混淆,这显然是 MOSEK 并行化其代码所必需的。无论如何,解决方案是使用 OpenBLAS,使用标志“USE_OPENMP=1”编译。

关于c++ - 影响 Makefile 中其他库的库,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34771607/

相关文章:

c++ - 使用默认参数调用 C++ 函数

c - 对 nxn 矩阵的所有可能排列进行编程,在 c 中给出唯一的和

无法计算出此 C 程序中使用函数计算总和和平均值的输出

c - Ubuntu 上对 exp 的 undefined reference (包括 math.h 和与 -lm 的链接)

c - Makefile 可能错误,未定义对 C 中函数的引用

c++ - 虚函数和纯虚函数的区别

c++ - 初始化 POD 结构的基类

c - CentOS 版本之间的 glibc 差异

c++ - 动态包含一个 CUDA 文件

c++ - 从 udp 接收帧对于人脸识别来说太慢了