gcc -l选项的位置

时间:2015-12-08 06:23:22

标签: c gcc linker

public class MainActivity extends Activity { ImageButton ib; private static Bitmap Image = null; private static final int GALLERY = 1; private static Bitmap rotateImage = null; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); ib = (ImageButton)findViewById(R.id.profile_pic); ib.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { // TODO Auto-generated method stub ib.setImageBitmap(null); if (Image != null) Image.recycle(); Intent intent = new Intent(); intent.setType("image/*"); intent.setAction(Intent.ACTION_GET_CONTENT); startActivityForResult(Intent.createChooser(intent, "Select Picture"), GALLERY); } }); } protected void onActivityResult(int requestCode, int resultCode, Intent data) { if (requestCode == GALLERY && resultCode != 0) { Uri mImageUri = data.getData(); try { Image = Media.getBitmap(this.getContentResolver(), mImageUri); if (getOrientation(getApplicationContext(), mImageUri) != 0) { Matrix matrix = new Matrix(); matrix.postRotate(getOrientation(getApplicationContext(), mImageUri)); if (rotateImage != null) rotateImage.recycle(); rotateImage = Bitmap.createBitmap(Image, 0, 0, Image.getWidth(), Image.getHeight(), matrix, true); ib.setImageBitmap(rotateImage); } else ib.setImageBitmap(Image); } catch (FileNotFoundException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } } } public static int getOrientation(Context context, Uri photoUri) { /* it's on the external media. */ Cursor cursor = context.getContentResolver().query(photoUri, new String[] { MediaStore.Images.ImageColumns.ORIENTATION }, null, null, null); if (cursor.getCount() != 1) { return -1; } cursor.moveToFirst(); return cursor.getInt(0); } } 的手册页有一节描述gcc选项的位置:

  

在您编写此选项的命令中,它会有所不同;链接器搜索并处理库和对象              文件按指定顺序排列。因此,-l在文件foo.o -lz bar.o之后但z之前搜索库foo.o。如果bar.o              是指bar.o中的函数,可能无法加载这些函数。

问题是:

如果链接器搜索&按顺序处理文件列表,然后命令不应该在任何源代码和&之前指定z选项。目标文件,而不是它们之后,以便库可以用于所有目标文件。

1 个答案:

答案 0 :(得分:1)

链接器只是按照它们在命令行中显示的顺序解析外部引用。

以您的引用为例,foo.o -lz bar.o:如果foo.o使用z库中的函数,则在链接器加载z库时会解析这些函数。但是它并没有真正缓存这些条目,一旦使用z库解析了外部引用,链接器就会忘记它们。现在当bar.o出现并尝试使用z库中的函数时,这些函数将无法解析,因为链接器不会再次读取z库。