交叉编译时可以编译和链接使用不同的编译器吗?

时间:2018-01-15 07:41:50

标签: gcc clang ar

我想知道我是否可以使用不同的编译器进行编译和链接。

例如,我有两个文件,a.c和b.c, 我用clang来编译a.c和b.c:

clang -c a.c -o a.o
clang -c b.c -o b.o

然后使用gcc将两个.o文件链接为so库:

gcc -lm -lz -shared a.o b.o -o libad.so

我成功生成了so文件,但使用此库时应用程序将崩溃。

更新: 更详细的信息:我所做的是交叉编译,目标平台是armv7a。我使用android-NDK并在MAC上编译代码。所以gcc是arm-linux-androideabi-gcc,clang是arm-linux-androideabi -clang。

1 个答案:

答案 0 :(得分:0)

除非在链接时指定特殊标志(-fuse-ld=xxx [1] [2]),否则clang和gcc都会调用默认的系统链接器(在macOS上为lld并且可能是{{ 1)}在Linux上)。因此,使用gcc或clang运行第二个语句将生成相同的链接二进制文件。

[1] https://gcc.gnu.org/onlinedocs/gcc/Link-Options.html

[2] http://clang-developers.42468.n3.nabble.com/LLD-to-be-the-default-linker-in-Clang-td4053949.html