我想知道我是否可以使用不同的编译器进行编译和链接。
例如,我有两个文件,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。
答案 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