2

我想在 MBP 上编译一个共享库,根据此处给出的建议,我已切换到clang(from gcc) 来创建共享库。我makefile的是:

CC = clang
CFLAGS = -c -fPIC -Wall -O3 -lpthread -g
BaseDir = /Users/admin/Prog/
Include = -I$(BaseDir)UMFPACK/Include -I$(BaseDir)AMD/Include -I$(BaseDir)SuiteSparse_config
Lib = -L$(BaseDir)UMFPACK/Lib -L$(BaseDir)AMD/Lib -L$(BaseDir)GotoBLAS2 -L$(BaseDir)SuiteSparse_config
AddFiles = -lumfpack -lamd -lgoto2 -lsuitesparseconfig
StaticLibs = $(BaseDir)GotoBLAS2/libgoto2.a $(BaseDir)UMFPACK/Lib/libumfpack.a $(BaseDir)AMD/Lib/libamd.a $(BaseDir)SuiteSparse_config/libsuitesparseconfig.a

all: TDS.o TDSJac.o ExtraRoutines.o CalcVFC.o TDS.h
        $(CC) $(Include) $(Lib) $(AddFiles) -dynamiclib -lpthread -o libTDS.so $^ -lm -g $(StaticLibs)

TDS.o: TDS.c TDS.h
        $(CC) $(Include) $(CFLAGS) $^

TDSJac.o: TDSJac.c TDS.h
        $(CC) $(CFLAGS) $^

ExtraRoutines.o: ExtraRoutines.c TDS.h
        $(CC) $(CFLAGS) $^

CalcVFC.o: CalcVFC.c TDS.h
        $(CC) $(CFLAGS) $^

MexFile: TDSGateway.c
        mex -g -largeArrayDims -ldl TDSGateway.c

Move:
        mv libTDS.so ../../
        mv TDSGateway.mexmaci64 ../../

我在这里所做的是: 1) 只编译TDS.c, TDSJac.c, ExtraRoutines.c, 和CalcVFC.c创建四个对应的目标文件。2)使用以下命令合并目标文件并创建共享库:

clang -I(Some folders) -L(Some folders) -l(Some libraries) -shared -lpthread -o libTDS.so TDS.o TDSJac.o ExtraRoutines.o CalcVFC.o TDS.h -lm -g
clang: error: cannot specify -o when generating multiple output files

由于我对 clang 完全陌生,我不知道 Makefile 有什么问题。(如果我替换CC=clangCC=gcc,一切正常。)我搜索了互联网但没有成功。clang 的手册页没有提到共享库。我什至无法从 clang主页中得到任何东西。如果能帮助我解决这个问题,我们将不胜感激。

提前感谢您的帮助。

4

2 回答 2

1

我昨天遇到了几乎同样的问题。但我从未使用过cmake。我正在使用我公司自己的 makefile 系统,所以我只能告诉你,到目前为止,是什么解决了我的问题。

Clang 在为您提供有关错误情况的正确提示方面仍然存在一些问题。链接错误是:

/usr/bin/ld: /usr/lib/crt1.o: relocation R_X86_64_32 against `_DYNAMIC' can not be used when making a shared object; recompile with -fPIC

我解决了这个问题,因为我发现 -shared 参数必须在 -o Xo 参数后面。正如我所见,这也不是您的情况。你应该先试试。

在我们的例子中,我还必须使用 -WL 或 -L 来解析 LFlags(afaik 使用哪个并不重要,但我读到了一个与 -Wl 相关的 clang 错误)。但是,在使用 cmake 时,您必须在多大程度上解析 LFlags。

于 2013-08-06T07:52:40.323 回答
1

您已将标头 ( TDS.h) 列为依赖项,这很好,但您随后将其$^用作输入,其中包括所有依赖项。您不应将标题列为输入。它根本不应该在命令行上,clang这实际上是一个错误。

错误信息不明显,但很容易解决。您有 2 个选择:

  1. 明确而不是使用$^. 您可以将一个变量用于输入,另一个用于依赖项,例如;或者
  2. 使用中间.o文件而不是.c文件作为.so. 这些*.o文件可以依赖于.h它们包含的任何文件。
于 2015-05-28T03:02:12.947 回答