顯示具有 gcc 標籤的文章。 顯示所有文章
顯示具有 gcc 標籤的文章。 顯示所有文章

2013年4月7日 星期日

gcc引用非標準函式庫(gcc -l -L)

gcc引用非標準函式庫要求正確的引用順序
格式:
gcc [source code: .c, .o, .a] [ -l | -L ]
Example:
gcc sin.c -lm -L/usr/lib -I/usr/include
 
 
Try:
gcc $(CFLAGS) -o xxx xxx.o ../../dbus/libdbus.a  = O OK 
gcc $(CFLAGS) -ldbus -L../../dbus -o xxx xxx.o  = X FAIL
gcc $(CFLAGS) -ldbus -L../../dbus -o xxx xxx.o  = X FAIL
gcc $(CFLAGS) -o xxx xxx.o -ldbus -L../../dbus  = O OK 
gcc $(CFLAGS) -o xxx xxx.o -L../../dbus  = X FAIL
gcc $(CFLAGS) -o xxx xxx.o -L../../dbus -ldbus  = O OK  

gcc -I、:=與#include

http://www.rapidtables.com/code/linux/gcc/gcc-i.htm

gcc -I option flag

gcc -I adds include directory of header files.
Syntax
$ gcc -Idir [options] [source files] [object files] [-o output file]
Example
proj/src/myheader.h:

// myfile.h
#define NUM1 5



myfile.c:

// myfile.c
#include
#include "myheader.h"

void main()
{
int num = NUM1;
printf("num=%d\n", num);
}



Build myfile.c without include directory proj/src :

$ gcc myfile.c -o myfile
myfile.c:2:22: fatal error: myheader.h: No such file or directory
compilation terminated.
$



Build myfile.c with include directory proj/src :

$ gcc -Iproj/src myfile.c -o myfile
$ ./myfile
num=5
$


這個方法是可行的,之前的編譯include路徑無效問題出現在
GCC=gcc
LIBFLAGS:=$(CFLAGS) -c
CFLAGS:= -Dxxx -Wall -g -I...
LIBFLAGS使用當下的選項,CFLAGS為空值,從下make指令後可看出。
應該改為:
GCC=gcc
LIBFLAGS=$(CFLAGS) -c
CFLAGS:= -Dxxx -Wall -g -I...

2013年4月3日 星期三

正當我被GCC "undefined reference"搞得死去活來時...

(1)
拜讀了這篇精闢的解說....
http://ticktick.blog.51cto.com/823160/431329
(2)
undefined reference還是除不完
發現undefined reference to android_atomic_release_cas

extern inline int android_atomic_release_cas(int32_t old_value,
int32_t new_value,
volatile int32_t *ptr)
{
android_memory_barrier();
return android_atomic_cas(old_value, new_value, ptr);
}

改用g++編譯。
(3)
g++編譯錯誤, invalid conversion from...
解决方法:CXXFLAGS = -fpermissive

2013年2月20日 星期三

看 GCC 預設幫使用者加了什麼東西

看 GCC 預設幫使用者加了什麼東西

http://www.study-area.org/cyril/opentools/opentools/x869.html

gcc怎麼知道去哪裡找foo.c裡面所include的header檔,連結資料庫 與系統定義呢? 總共有下列來源指定gcc去那找。

  1. 當初在編譯時指定的(在~gcc/gcc/collect2.c:locatelib()
  2. 寫在specs內的
  3. 後來用-D -I -L指定的
  4. gcc環境變數設定(編譯的時候)
  5. ld.so的環境變數(這是run time的時候)

 

 

  1. $ echo 'main(){printf("hello world\n");}' | gcc -E -v -
文字介面顯示:
  1. Using built-in specs.
  2. Target: i486-linux-gnu
  3. Configured with: ../src/configure -v --enable-languages=c,c++,fortran,objc,obj-c++,treelang --prefix=/usr
  4. --enable-shared --with-system-zlib --libexecdir=/usr/lib --without-included-gettext --enable-threads=posix
  5. --enable-nls --with-gxx-include-dir=/usr/include/c++/4.1.3 --program-suffix=-4.1 --enable-__cxa_atexit
  6. --enable-clocale=gnu --enable-libstdcxx-debug --enable-mpfr --enable-checking=release i486-linux-gnu
  7. Thread model: posix
  8. gcc version 4.1.3 20070929 (prerelease) (Ubuntu 4.1.2-16ubuntu2)
  9.  /usr/lib/gcc/i486-linux-gnu/4.1.3/cc1 -E -quiet -v - -mtune=generic
  10. ignoring nonexistent directory "/usr/local/include/i486-linux-gnu"
  11. ignoring nonexistent directory "/usr/lib/gcc/i486-linux-gnu/4.1.3/../../../../i486-linux-gnu/include"
  12. ignoring nonexistent directory "/usr/include/i486-linux-gnu"
  13. #include "..." search starts here:
  14. #include <...> search starts here:
  15.  /usr/local/include
  16.  /usr/lib/gcc/i486-linux-gnu/4.1.3/include
  17.  /usr/include
  18. End of search list.
  19. # 1 "<stdin>"
  20. # 1 "<built-in>"
  21. # 1 "<command line>"
  22. # 1 "<stdin>"
  23. main(){printf("hello world\n");}
用途: 查看reference的include檔 可以用來展開經過preprocessor處理過後的#define函式