【发布时间】:2015-04-13 14:56:50
【问题描述】:
我有一个使用 makefile 的C-code which works fine。现在,我正在尝试 convert it to mex 文件,以便我可以从 Matlab 运行它。我也是using makefile approach。但是,mex 的 makefile 给了我错误。
这是我想要与 mex 文件一起编译的 tsnnls lib。
C项目组织:
tsnnls_test_DKU.c
Include_4_TSNNLS.c
Include_4_TSNNLS.h
"Include_4_TSNNLS.*" 文件有函数TestingLibraries() 调用第三部分库;虽然我试图保持“tsnnls_test_DKU.c”非常简单:
原始代码:tsnnls_test_DKU.c
int TestingLibraries() ;
int main( int argc, char* argv[] )
{
int k = TestingLibraries() ;
return(1);
}
现在,代码已更改:
更改代码:tsnnls_test_DKU.c:
#include "mex.h"
#include <math.h>
int TestingLibraries() ;
void mexFunction (int nlhs, mxArray *plhs[], int nrhs, const mxArray *prhs[]) {
int k = TestingLibraries() ;
}
原始制作文件(有效
CXX = gcc
FLAGS =
CFLAGS = "-m64" ## "-m32"
INCLUDE_TSNNLS = -I/home/dkumar/libtsnnls-2.3.3 -I/home/dkumar/libtsnnls-2.3.3/tsnnls -I/home/dkumar/libtsnnls-2.3.3/tsnnls/taucs_basic
#################### ALL TSNNLS lib related ##########################
## this is where all object file (*.o) generated by tsnnls library makefile are located.
tsnnl_PATH = /home/dkumar/libtsnnls-2.3.3/tsnnls/
# Here is a simple Make Macro.
OBJS_tsnnls1 = tsnnls_test_DKU.o
OBJS_ADD = Include_4_TSNNLS.o
# Here is a Make Macro that uses the backslash to extend to multiple lines.
OBJS_tsnnls0 = libtsnnls_la-taucs_malloc.o libtsnnls_la-taucs_ccs_order.o \
libtsnnls_la-taucs_ccs_ops.o libtsnnls_la-taucs_vec_base.o \
libtsnnls_la-taucs_complex.o libtsnnls_la-colamd.o \
libtsnnls_la-amdbar.o libtsnnls_la-amdexa.o \
libtsnnls_la-amdtru.o libtsnnls_la-genmmd.o \
libtsnnls_la-taucs_timer.o libtsnnls_la-taucs_sn_llt.o \
libtsnnls_la-taucs_ccs_base.o libtsnnls_la-tlsqr.o \
libtsnnls_la-tsnnls.o libtsnnls_la-lsqr.o
## adding "$(OBJS_PATH)" to each word in "$(OBJS)"
# which in our case is basically to add the same folder in front of all "*.o" object files.
OBJS_TEMP = $(addprefix $(tsnnl_PATH), $(OBJS_tsnnls0))
# OBJS_LOC is in current working directory,
OBJS_tsnnlsALL = $(OBJS_TEMP) $(OBJS_tsnnls1)
# Libraries for tsnnls
STLIB_tsnnls = /usr/local/lib/taucs_full/lib/linux/libtaucs.a
LIBS_tsnnls = -largtable2 -llapack -lblas -lquadmath -lm
########################################################################
TARGET = tsnnls_test_DKU
REBUILDABLES = $(OBJS_tsnnls1) $(TARGET)
LIBS = $(LIBS_tsnnls) $(STLIB_tsnnls)
INCLUDE = $(INCLUDE_TSNNLS)
all : $(TARGET)
echo All done
clean :
rm -f $(REBUILDABLES)
echo Clean done
$(OBJS_ADD): Include_4_TSNNLS.c
gcc -c -o Include_4_TSNNLS.o Include_4_TSNNLS.c
# Final linking
$(TARGET) : $(OBJS_tsnnlsALL) $(OBJS_ADD) $(LIBS)
$(CXX) -g -o $@ $(INCLUDE) $(CFLAGS) $^
更改的 Makefile 无法运行 请注意,我已使用 gcc 编译器将链接部分恢复为原始部分;但是,我想在这里使用 mex。
我根据自己的理解更改了一些行,并使用了标签“# mex”。
此外,Include_4_TSNNLS.o 正在成功创建。此外,之前的“include”问题已通过硬连线所有路径得到解决。
MEXSUFFIX = mexa64 # mex
MATLABHOME = /usr/local/MATLAB/R2011b # mex
MEX = /usr/local/MATLAB/R2011b/bin/mex # mex
MEXFLAGS = -cxx CC='$(CXX)' CXX='$(CXX)' LD='$(CXX)' # mex
CXX = gcc
FLAGS =
CFLAGS = -fPIC -pthread -DMX_COMPAT_32 -DMATLAB_MEX_FILE -m64 ## "-m32"
INCLUDE_TSNNLS = -I/usr/local/MATLAB/R2011b/extern/include -I/home/dkumar/libtsnnls-2.3.3 -I/home/dkumar/libtsnnls-2.3.3/tsnnls -I/home/dkumar/libtsnnls-2.3.3/tsnnls/taucs_basic
#################### ALL TSNNLS lib related ##########################
## this is where all object file (*.o) generated by tsnnls library makefile are located.
tsnnl_PATH = /home/dkumar/libtsnnls-2.3.3/tsnnls/
# Here is a simple Make Macro.
OBJS_tsnnls1 = tsnnls_test_DKU.o
OBJS_ADD = Include_4_TSNNLS.o
# Here is a Make Macro that uses the backslash to extend to multiple lines.
OBJS_tsnnls0 = libtsnnls_la-taucs_malloc.o libtsnnls_la-taucs_ccs_order.o \
libtsnnls_la-taucs_ccs_ops.o libtsnnls_la-taucs_vec_base.o \
libtsnnls_la-taucs_complex.o libtsnnls_la-colamd.o \
libtsnnls_la-amdbar.o libtsnnls_la-amdexa.o \
libtsnnls_la-amdtru.o libtsnnls_la-genmmd.o \
libtsnnls_la-taucs_timer.o libtsnnls_la-taucs_sn_llt.o \
libtsnnls_la-taucs_ccs_base.o libtsnnls_la-tlsqr.o \
libtsnnls_la-tsnnls.o libtsnnls_la-lsqr.o
## adding "$(OBJS_PATH)" to each word in "$(OBJS)"
# which in our case is basically to add the same folder in front of all "*.o" object files.
OBJS_TEMP = $(addprefix $(tsnnl_PATH), $(OBJS_tsnnls0))
# OBJS_LOC is in current working directory,
OBJS_tsnnlsALL = $(OBJS_TEMP) $(OBJS_tsnnls1)
# Libraries for tsnnls
##STLIB_tsnnls = /usr/local/lib/taucs_full/lib/linux/libtaucs.a
STLIB_tsnnls = /usr/local/lib/libtaucs.a
#LIBS_tsnnls = -largtable2 -llapack -lblas -lquadmath -lm
LIBS_tsnnls = -largtable2 -llapack -lblas -lm
########################################################################
## TARGET = tsnnls_test_DKU
TARGET_WO_EXTN = tsnnls_test_DKU # mex
TARGET = TARGET_WO_EXTN
#TARGET = $(TARGET_WO_EXTN).$(MEXSUFFIX) # mex
REBUILDABLES = $(OBJS_tsnnls1) $(TARGET) *.mexa64
LIBS = $(LIBS_tsnnls) $(STLIB_tsnnls)
INCLUDE = $(INCLUDE_TSNNLS)
all : $(TARGET)
echo All done
clean :
rm -f $(REBUILDABLES)
echo Clean done
$(OBJS_ADD): Include_4_TSNNLS.c
gcc -c -o $(INCLUDE) Include_4_TSNNLS.o Include_4_TSNNLS.c
# CHANGED FROM HERE # mex
tsnnls_test_DKU.o: tsnnls_test_DKU.c Include_4_TSNNLS.c $(OBJS_tsnnlsALL) $(OBJS_ADD)
$(CXX) $(CFLAGS) $(INCLUDE) -c $^
# Final linking
$(TARGET): tsnnls_test_DKU.o $(OBJS_tsnnlsALL) $(OBJS_ADD) $(LIBS)
$(MEX) $(MEXFLAGS) -output $(TARGET_WO_EXTN) $^ -largeArrayDims
我收到以下链接错误:
dkumar@kumar-Aspire-E1-510 ~/CPP_ExampleCodes_DKU/Using_tsnnls_DKU_copy_2_MEX $ make
make: Circular tsnnls_test_DKU.o <- tsnnls_test_DKU.o dependency dropped.
gcc -fPIC -pthread -DMX_COMPAT_32 -DMATLAB_MEX_FILE -I/usr/local/MATLAB/R2011b/extern/include -I/home/dkumar/libtsnnls-2.3.3 -I/home/dkumar/libtsnnls-2.3.3/tsnnls -I/home/dkumar/libtsnnls-2.3.3/tsnnls/taucs_basic -c tsnnls_test_DKU.c Include_4_TSNNLS.c /home/dkumar/libtsnnls-2.3.3/tsnnls/libtsnnls_la-taucs_malloc.o /home/dkumar/libtsnnls-2.3.3/tsnnls/libtsnnls_la-taucs_ccs_order.o /home/dkumar/libtsnnls-2.3.3/tsnnls/libtsnnls_la-taucs_ccs_ops.o /home/dkumar/libtsnnls-2.3.3/tsnnls/libtsnnls_la-taucs_vec_base.o /home/dkumar/libtsnnls-2.3.3/tsnnls/libtsnnls_la-taucs_complex.o /home/dkumar/libtsnnls-2.3.3/tsnnls/libtsnnls_la-colamd.o /home/dkumar/libtsnnls-2.3.3/tsnnls/libtsnnls_la-amdbar.o /home/dkumar/libtsnnls-2.3.3/tsnnls/libtsnnls_la-amdexa.o /home/dkumar/libtsnnls-2.3.3/tsnnls/libtsnnls_la-amdtru.o /home/dkumar/libtsnnls-2.3.3/tsnnls/libtsnnls_la-genmmd.o /home/dkumar/libtsnnls-2.3.3/tsnnls/libtsnnls_la-taucs_timer.o /home/dkumar/libtsnnls-2.3.3/tsnnls/libtsnnls_la-taucs_sn_llt.o /home/dkumar/libtsnnls-2.3.3/tsnnls/libtsnnls_la-taucs_ccs_base.o /home/dkumar/libtsnnls-2.3.3/tsnnls/libtsnnls_la-tlsqr.o /home/dkumar/libtsnnls-2.3.3/tsnnls/libtsnnls_la-tsnnls.o /home/dkumar/libtsnnls-2.3.3/tsnnls/libtsnnls_la-lsqr.o Include_4_TSNNLS.o
gcc: warning: /home/dkumar/libtsnnls-2.3.3/tsnnls/libtsnnls_la-taucs_malloc.o: linker input file unused because linking not done
gcc: warning: /home/dkumar/libtsnnls-2.3.3/tsnnls/libtsnnls_la-taucs_ccs_order.o: linker input file unused because linking not done
gcc: warning: /home/dkumar/libtsnnls-2.3.3/tsnnls/libtsnnls_la-taucs_ccs_ops.o: linker input file unused because linking not done
gcc: warning: /home/dkumar/libtsnnls-2.3.3/tsnnls/libtsnnls_la-taucs_vec_base.o: linker input file unused because linking not done
gcc: warning: /home/dkumar/libtsnnls-2.3.3/tsnnls/libtsnnls_la-taucs_complex.o: linker input file unused because linking not done
gcc: warning: /home/dkumar/libtsnnls-2.3.3/tsnnls/libtsnnls_la-colamd.o: linker input file unused because linking not done
gcc: warning: /home/dkumar/libtsnnls-2.3.3/tsnnls/libtsnnls_la-amdbar.o: linker input file unused because linking not done
gcc: warning: /home/dkumar/libtsnnls-2.3.3/tsnnls/libtsnnls_la-amdexa.o: linker input file unused because linking not done
gcc: warning: /home/dkumar/libtsnnls-2.3.3/tsnnls/libtsnnls_la-amdtru.o: linker input file unused because linking not done
gcc: warning: /home/dkumar/libtsnnls-2.3.3/tsnnls/libtsnnls_la-genmmd.o: linker input file unused because linking not done
gcc: warning: /home/dkumar/libtsnnls-2.3.3/tsnnls/libtsnnls_la-taucs_timer.o: linker input file unused because linking not done
gcc: warning: /home/dkumar/libtsnnls-2.3.3/tsnnls/libtsnnls_la-taucs_sn_llt.o: linker input file unused because linking not done
gcc: warning: /home/dkumar/libtsnnls-2.3.3/tsnnls/libtsnnls_la-taucs_ccs_base.o: linker input file unused because linking not done
gcc: warning: /home/dkumar/libtsnnls-2.3.3/tsnnls/libtsnnls_la-tlsqr.o: linker input file unused because linking not done
gcc: warning: /home/dkumar/libtsnnls-2.3.3/tsnnls/libtsnnls_la-tsnnls.o: linker input file unused because linking not done
gcc: warning: /home/dkumar/libtsnnls-2.3.3/tsnnls/libtsnnls_la-lsqr.o: linker input file unused because linking not done
gcc: warning: Include_4_TSNNLS.o: linker input file unused because linking not done
/usr/local/MATLAB/R2011b/bin/mex -cxx CC='gcc' CXX='gcc' LD='gcc' -output tsnnls_test_DKU tsnnls_test_DKU.o /home/dkumar/libtsnnls-2.3.3/tsnnls/libtsnnls_la-taucs_malloc.o /home/dkumar/libtsnnls-2.3.3/tsnnls/libtsnnls_la-taucs_ccs_order.o /home/dkumar/libtsnnls-2.3.3/tsnnls/libtsnnls_la-taucs_ccs_ops.o /home/dkumar/libtsnnls-2.3.3/tsnnls/libtsnnls_la-taucs_vec_base.o /home/dkumar/libtsnnls-2.3.3/tsnnls/libtsnnls_la-taucs_complex.o /home/dkumar/libtsnnls-2.3.3/tsnnls/libtsnnls_la-colamd.o /home/dkumar/libtsnnls-2.3.3/tsnnls/libtsnnls_la-amdbar.o /home/dkumar/libtsnnls-2.3.3/tsnnls/libtsnnls_la-amdexa.o /home/dkumar/libtsnnls-2.3.3/tsnnls/libtsnnls_la-amdtru.o /home/dkumar/libtsnnls-2.3.3/tsnnls/libtsnnls_la-genmmd.o /home/dkumar/libtsnnls-2.3.3/tsnnls/libtsnnls_la-taucs_timer.o /home/dkumar/libtsnnls-2.3.3/tsnnls/libtsnnls_la-taucs_sn_llt.o /home/dkumar/libtsnnls-2.3.3/tsnnls/libtsnnls_la-taucs_ccs_base.o /home/dkumar/libtsnnls-2.3.3/tsnnls/libtsnnls_la-tlsqr.o /home/dkumar/libtsnnls-2.3.3/tsnnls/libtsnnls_la-tsnnls.o /home/dkumar/libtsnnls-2.3.3/tsnnls/libtsnnls_la-lsqr.o Include_4_TSNNLS.o /usr/lib/libargtable2.so /usr/lib/liblapack.so /usr/lib/libblas.so /usr/lib/x86_64-linux-gnu/libm.so /usr/local/lib/libtaucs.a -largeArrayDims
Warning: You are using gcc version "4.8.2-19ubuntu1)". The version
currently supported with MEX is "4.3.4".
For a list of currently supported compilers see:
http://www.mathworks.com/support/compilers/current_release/
/usr/bin/ld: /home/dkumar/libtsnnls-2.3.3/tsnnls/libtsnnls_la-taucs_ccs_order.o: relocation R_X86_64_32 against `.rodata' can not be used when making a shared object; recompile with -fPIC
/home/dkumar/libtsnnls-2.3.3/tsnnls/libtsnnls_la-taucs_ccs_order.o: error adding symbols: Bad value
collect2: error: ld returned 1 exit status
mex: link of ' "tsnnls_test_DKU.mexa64"' failed.
make: *** [tsnnls_test_DKU] Error 1
有人可以帮我提供链接选项吗?
【问题讨论】:
-
使用 -I(matlab_dir)/extern/include 将 makefile 指向标头
-
@user3528438 我认为我已经使用了 include :
INCLUDE = -I$(MATLABHOME)/extern/include $(INCLUDE_TSNNLS)然后在制作 TARGET 时包含它。但是,我可能在编译器选项中传递了错误,无法弄清楚。 -
在代码的底部,您使用“gcc -c -o...”进行编译并使用“$(MEX) -g -o ....”进行链接。由于您的 $(INCLUDE) 在 $(MEX) 之后,因此它被视为链接器选项而不是编译器选项。尝试将 $(INCLUDE) 和 $(CFLAGS) 移近 gcc。
-
@user3528438 我试过关注;但是,仍然得到同样的错误:
$(OBJS_ADD): Include_4_TSNNLS.c gcc -c -o Include_4_TSNNLS.o Include_4_TSNNLS.c $(CFLAGS) $(INCLUDE)然后$(TARGET) : $(OBJS_tsnnlsALL) $(OBJS_ADD) $(LIBS) $(MEX) -g -o $@ $^ -
我对 mex 不太了解。但是,当然在规则 $(OBJS_ADD): Include_4_TSNNLS.c 中,您已经包含了 mex 包含库。您包括在链接阶段。有人可能会给你精确的命令。