5

LLVM コンパイラ パスを開発しています。次の方法でパスを実行します。

  1. LLVM ビットコードにコンパイル

    clang  foo.c -emit-llvm -c -o foo.bc
    
  2. opt を使用して foo.bc を実行します (この手順を実行しなくてもエラーが発生します)。

  3. コンパイルしてオブジェクト ファイルに戻す

    clang  -c -o foo.o foo.bc
    
  4. 現在、foo.o は静的ライブラリの一部である可能性があります。

    ar rc libfoo.a foo.o
    
  5. すべての C ファイルがこの方法でコンパイルされている場合、libfoo.a に対してリンクできません。

    clang libfoo.a linkme.o -o linkme
    
    linkme.o:linkme.bc:function main: error: undefined reference to 'foo'
    clang: error: linker command failed with exit code 1 (use -v to see invocation)
    

ソース ファイル:

foo.c:

int foo(int a)
{
    return a;
}

foo.h

int foo(int a);

linkme.c

#include "foo.h"

int main(int argc, char *argv[])
{
   foo(6);

   return 0;
}
4

1 に答える 1

8

今、私はばかげていると感じています。引数の順序だけで、.bc ファイルとは関係ありません。

作品:

clang  linkme.o  libfoo.a -o linkme

失敗:

clang  libfoo.a linkme.o -o linkme
于 2013-01-31T15:49:28.620 に答える