gcc - 创建共享库时出现 Clang 错误

标签 gcc llvm clang llvm-clang

我想在 MBP 上编译一个共享库,并根据给出的建议here ,我已切换到 clang (来自 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.cTDSJac.cExtraRoutines.cCalcVFC.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=gcc 替换 CC=clang,一切正常。) 我在网上搜索没有成功。 clang 的手册页没有提到共享库。我什至无法从 clang homepage 中得到任何东西。 。如果帮助我解决这个问题,我们将不胜感激。

感谢您提前提供的帮助。

最佳答案

我昨天也遇到了几乎同样的问题。 但我从来没有使用过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 X.o 参数后面。据我所知,这也不适合您的情况。你应该先尝试一下。

在我们的例子中,我还必须使用 -WL 或 -L 解析 LFlags(据我所知,选择哪一个并不重要,但我读到了与 -Wl 相关的 clang bug)。 但我不知道使用 cmake 时必须解析 LFlags 到什么程度。

关于gcc - 创建共享库时出现 Clang 错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16127332/

相关文章:

gcc - g++、静态初始化和 -nostdlib

c++ - 无限模板递归,因为仅使用 gcc 没有 bool 表达式优化

function - 在 LLVM 函数中反向迭代基本 block

海湾合作委员会错误: gcc: error trying to exec 'cc1' : execvp: No such file or directory

c++ - Travis CI 上 Boost 中对 `std::__cxx11::basic_string 的 undefined reference

c++ - LLVM JIT 编译的程序找不到外部函数

c++ - Makefile:将 llvm 程序编译为 g++ 编译的 bnfc 项目的一部分

C++构造函数语法解释

Mavericks 升级后 OS X 上的 C++ 编译问题

c - 使用标记为 __unused 的参数时发出警告