gcc 编译引用库时注意相互引用的顺序

g++ test.o -L/home/hejw/LLVM/clang+llvm-3.4-x86_64-unknown-ubuntu12.04/lib -ldl -lz -lrt -lm -lLLVMInstrumentation -lLLVMIRReader -lLLVMAsmParser -lLLVMDebugInfo -lLLVMOption -lLLVMLTO -lLLVMLinker -lLLVMipo -lLLVMVectorize -lLLVMBitWriter -lLLVMBitReader -lLLVMTableGen -lLLVMR600CodeGen -lLLVMR600Desc -lLLVMR600Info -lLLVMR600AsmPrinter -lLLVMSystemZDisassembler -lLLVMSystemZCodeGen -lLLVMSystemZAsmParser -lLLVMSystemZDesc -lLLVMSystemZInfo -lLLVMSystemZAsmPrinter -lLLVMHexagonCodeGen -lLLVMHexagonAsmPrinter -lLLVMHexagonDesc -lLLVMHexagonInfo -lLLVMNVPTXCodeGen -lLLVMNVPTXDesc -lLLVMNVPTXInfo -lLLVMNVPTXAsmPrinter -lLLVMCppBackendCodeGen -lLLVMCppBackendInfo -lLLVMMSP430CodeGen -lLLVMMSP430Desc -lLLVMMSP430Info -lLLVMMSP430AsmPrinter -lLLVMXCoreDisassembler -lLLVMXCoreCodeGen -lLLVMXCoreDesc -lLLVMXCoreInfo -lLLVMXCoreAsmPrinter -lLLVMMipsDisassembler -lLLVMMipsCodeGen -lLLVMMipsAsmParser -lLLVMMipsDesc -lLLVMMipsInfo -lLLVMMipsAsmPrinter -lLLVMARMDisassembler -lLLVMARMCodeGen -lLLVMARMAsmParser -lLLVMARMDesc -lLLVMARMInfo -lLLVMARMAsmPrinter -lLLVMAArch64Disassembler -lLLVMAArch64CodeGen -lLLVMAArch64AsmParser -lLLVMAArch64Desc -lLLVMAArch64Info -lLLVMAArch64AsmPrinter -lLLVMAArch64Utils -lLLVMPowerPCCodeGen -lLLVMPowerPCAsmParser -lLLVMPowerPCDesc -lLLVMPowerPCInfo -lLLVMPowerPCAsmPrinter -lLLVMSparcCodeGen -lLLVMSparcDesc -lLLVMSparcInfo -lLLVMX86Disassembler -lLLVMX86AsmParser -lLLVMX86CodeGen -lLLVMSelectionDAG -lLLVMAsmPrinter -lLLVMX86Desc -lLLVMX86Info -lLLVMX86AsmPrinter -lLLVMX86Utils -lLLVMMCDisassembler -lLLVMMCParser -lLLVMInterpreter -lLLVMMCJIT -lLLVMJIT -lLLVMCodeGen -lLLVMObjCARCOpts -lLLVMScalarOpts -lLLVMInstCombine -lLLVMTransformUtils -lLLVMipa -lLLVMAnalysis -lLLVMRuntimeDyld -lLLVMExecutionEngine -lLLVMTarget -lLLVMMC -lLLVMObject -lLLVMCore -lLLVMSupport -lpthread -ltinfo
/home/hejw/LLVM/clang+llvm-3.4-x86_64-unknown-ubuntu12.04/lib/libLLVMSupport.a(Signals.o): In function `llvm::sys::PrintStackTrace(_IO_FILE*)':
/home/users/aadgrand/LLVM/releases/ubuntu/final/llvm.src/lib/Support/Signals.cpp:(.text+0x577): undefined reference to `dladdr'
/home/users/aadgrand/LLVM/releases/ubuntu/final/llvm.src/lib/Support/Signals.cpp:(.text+0x5ea): undefined reference to `dladdr'
collect2: ld 返回 1

-ldl 没有放到最后,致使后面使用这个dl库的/libLLVMSupport.a无法引用。


另外就是gcc编译时注意源文件或者obj文件的位置,原因同上,

比如:main.c引用liba.a,

gcc -la main.c -L.
/tmp/cczOHu0t.o: In function `main':
main.c:(.text+0xa): undefined reference to `a'
collect2: ld 返回 1



==========================================================================

d.c
#include

int c(){
        printf("c()\n");
        return 1;
}


a.c

#include
extern int c();

int a(){
        printf ("aa\n");
        c();
        return 1;
}


main.c
int a();
int main(){
        a();
}

gcc *.c 或者 gcc d.c main.c a.c或者gcc *.o gcc main.o d.o a.o都可以没有顺序关系

但是ar  r liba.a a.o

ar r libd.a d.o            //不要编译出libc.a会冲突

然后 gcc main.o -la -ld -L.才能编译通过,其他顺序无法编译通过, 是按照调用的顺序放置,main.o调用liba.a, liba.a调用libd.a


so文件和.a是同样的情况。


交叉调用呢? a.c和d.c交叉引用的话, ld和la顺序都可以


 so的编号呢?:不能使用-l了,只能直接把库名写上。

那gcc是怎么样 -lpthread链接到有编号的so上的呢?

 通过/usr/lib/x86_64-linux-gnu/libpthread.so--->/lib/x86_64-linux-gnu/libpthread.so.0-->libpthread-2.15.so
 而/usr/lib/x86_64-linux-gnu/libpthread.so内容如下:
    /* GNU ld script
       Use the shared library, but some functions are only in
       the static library, so try that secondarily.  */
    OUTPUT_FORMAT(elf64-x86-64)
    GROUP ( /lib/x86_64-linux-gnu/libpthread.so.0 /usr/lib/x86_64-linux-gnu/libpthread_nonshared.a )



/lib/x86_64-linux-gnu/libpthread.so.0-->libpthread-2.15.so

符号链接文件可以通过ldconfig生成(我不小心把libpthread.so.0改名了,导致很多命令如ls,cp等不能用了,使用ldconfig恢复,里面有soname)



你可能感兴趣的:(原创文章)