linux編譯錯誤怎麼處理
你的系統時間不對,makefile生成的時間比你make的時候的時間還要晚,這就造成不符合事實的情況 修改:打開Makefile,任意行尾端加上一個空格,保存即可 或者修改你的電腦的系統時間,使其晚於Makefile生成的時間. 望採納!
Ⅱ linux 編譯內核幾個常見問題解決方法
第一次把自己編譯的驅動模塊載入進開發板,就出現問題,還好沒花費多長時間,下面列舉出現的問題及解決方案
1:出現insmod: error inserting 'hello.ko': -1 Invalid mole format
法一(網上的):是因為內核模塊生成的環境與運行的環境不一致,用linux-2.6.27內核源代碼生成的模塊,可能就不能在linux-2.6.32.2內核的linux環境下載入,需要在linux-2.6.27內核的linux環境下載入。
a.執行 uname -r //查看內核版本
b.一般出錯信息被記錄在文件/var/log/messages中,執行下面命令看錯誤信息
# cat /var/log/messages |tail
若出現類似下面:
Jun 4 22:07:54 localhost kernel:hello: version magic '2.6.35.6-45.fc14.i686.PAE
' should be '2.6.35.13-92.fc14.i686.PAE'
則把 Makefile里的KDIR :=/lib/moles/2.6.35.6-45.fc14.i686.PAE/build1 改為
KDIR :=/lib/moles/2.6.35.13-92.fc14.i686.PAE/build1 //改成自己內核源碼路徑
(這里的build1是一個文件鏈接,鏈接到/usr/src/kernels/2.6.35.6-45.fc14.i686.PAE和13-92的)
然並卵,我的fedora 14 /usr/src/kernels下並沒有2.6.35.13-92.fc14.i686.PAE,只有2.6.35.13-92.fc14.i686,雖然不知道兩者有什麼區別,但改成2.6.35.13-92.fc14.i686還是不行,照樣這個問題,還好後來在看教學視頻的到啟發
法二:改的還是那個位置
KDIR :=/opt/FriendlyARM/linux-2.6.32.2 //把這里改成你編譯生成kernel的那個路徑
all:
$ (MAKE) -C $ (KDIR) M = $ (PWD) moles ARCH=arm CROSS_COMPILE=arm-linux- //加這句
2. [70685.298483] hello: mole license 'unspecified' taints kernel.
[70685.298673] Disabling lock debugging e to kernel taint
方法:在模塊程序中加入: MODULE_LICENSE("GPL");
3. rmmod: chdir(2.6.32.2-FriendlyARM): No such file or directory 錯誤解決
方法:lsmod 可查看模塊信息
即無法刪除對應的模塊。
就是必須在/lib/moles下建立錯誤提示的對應的目錄((2.6.32.2)即可。
必須創建/lib/moles/2.6.32.2這樣一個空目錄,否則不能卸載ko模塊.
# rmmod nls_cp936
rmmod: chdir(/lib/moles): No such file or directory
但是這樣倒是可以卸載nls_cp936,不過會一直有這樣一個提示:
rmmod: mole 'nls_cp936' not found
初步發現,原來這是編譯kernel時使用make moles_install生成的一個目錄,
但是經測試得知,rmmod: mole 'nls_cp936' not found來自於busybox,並不是來自kernel
1).創建/lib/moles/2.6.32.2空目錄
2).使用如下源碼生成rmmod命令,就可以沒有任何提示的卸載ko模塊了[luther.gliethttp]
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <fcntl.h>
#include <string.h>
#include <errno.h>
int main(int argc, char *argv[])
{
const char *modname = argv[1];
int ret = -1;
int maxtry = 10;
while (maxtry-- > 0) {
ret = delete_mole(modname, O_NONBLOCK | O_EXCL);//系統調用sys_delete_mole
if (ret < 0 && errno == EAGAIN)
usleep(500000);
else
break;
}
if (ret != 0)
printf("Unable to unload driver mole \"%s\": %s\n",
modname, strerror(errno));
}
3).把生成的命令復制到文件系統
# arm-linux-gcc -static -o rmmod rmmod.c
# arm-linux-strip -s rmmod
# cp rmmod /nfs/
cp /nfs/rmmod /sbin
代碼如下:
proc.c
[html] view plain
<span style="font-size:18px;">#include <linux/mole.h>
#include <linux/kernel.h>
#include <linux/init.h>
#include <linux/proc_fs.h> /* Necessary because we use the proc fs */
#define procfs_name "proctest"
MODULE_LICENSE("GPL");
struct proc_dir_entry *Our_Proc_File;
int procfile_read(char *buffer,char **buffer_location,off_t offset, int buffer_length, int *eof, void *data)
{ int ret;
ret = sprintf(buffer, "HelloWorld!\n");
return ret;
}
int proc_init()
{ Our_Proc_File = create_proc_entry(procfs_name, 0644, NULL);
if (Our_Proc_File == NULL) {
remove_proc_entry(procfs_name, NULL);
printk(KERN_ALERT "Error: Could not initialize /proc/%s\n",procfs_name);
return -ENOMEM; }
Our_Proc_File->read_proc = procfile_read;//
// Our_Proc_File->owner = THIS_MODULE;
Our_Proc_File->mode = S_IFREG | S_IRUGO;
Our_Proc_File->uid = 0;
Our_Proc_File->gid = 0;
Our_Proc_File->size = 37;
printk("/proc/%s created\n", procfs_name);
return 0;
}
void proc_exit()
{ remove_proc_entry(procfs_name, NULL);
printk(KERN_INFO "/proc/%s removed\n", procfs_name);
}
mole_init(proc_init);
mole_exit(proc_exit);</span></span></span></span></span>
[html] view plain
<span style="font-size:18px;">
ifneq ($(KERNELRELEASE),)
obj-m :=proc.o
else
KDIR :=/opt/FriendlyARM/linux-2.6.32.2
#KDIR :=/lib/moles/2.6.35.13-92.fc14.i686.PAE/build1
PWD :=$(shell pwd)
all:
$(MAKE) -C $(KDIR) M=$(PWD) moles ARCH=arm CROSS_COMPILE=arm-linux-
clean:
rm -f *.ko *.o *.mod.o *.mod.c *.symvers
endif</span></span></span></span></span>
make後生成proc.ko,再在開發板上insmod proc.ko即可
執行 dmesg 就可以看到 產生的內核信息啦
Ⅲ uboot2010-09用arm-linux-gcc3.3.2編譯出現如下錯誤:請問該如何解決
1)
可以試試用arm-softfloat-linux-gnu和和arm-linux-gcc-3.4.5-glibc-2.3.62
2)
也可以改uboot的編譯選項把軟浮點去掉,位置可能在cpu/arm920t/config.mk或類似位置,把其中的-msoft-float去掉
Ⅳ linux編譯錯誤怎麼改
編譯內核出錯,只有重新編譯了。
make mrproper
make clean
。。。。
Ⅳ 我在linux環境下怎麼就是編譯不成功
編譯不成功多半軟體功能開關設置及依賴關系不支持。
首先要了解編譯的過程,真正了解了編譯的過程後就可以比較輕松的編譯各種軟體了。
1、configure,可以在configure 執行一下./configure --help來大致了解一下該軟體的一些開關和支持的性能,然後根據使用需要來設置需要開啟的性能和需要關閉的性能,以及需要哪些支持庫等等,然後再指定一下編譯路徑,做完這一切後,滿屏幕的check ....就開始了,這就是configrue的過程,和所做的事情
2、make,其實這一步才是真正的編輯步驟,而configure只是做一個環境的check,檢查系統環境及lib是不是對上一步所開啟的參數支持,只有check不出錯,也就是configure不出錯,就可以比較順利的進行編譯也就是make
3、make install 安裝,當成功編譯後就可以通過make install進行安裝了,安裝完成後就可以使用了。
比較容易報錯的地方就是configure這一步,因為這一步會檢查軟體及在configure這一步的設置開關功能中需要的依賴關系,並對現行系統進行檢查,尤其是最小化安裝的系統,報錯會比較多,可根據具體報錯內容來安裝相應的安裝包來完成軟體的依賴,直到check全部通過。有些軟體在make時也需要調用一些庫,具體要看軟體的reademe來了解具體編譯要求。如果再不行,就只能網上尋求幫助了。
另外,編譯也是一個經驗活,只編譯得多了,對一些常見的錯誤就會比較了解了,必定軟體依賴的庫常見的就那幾個,建議每編譯一款軟體做一個小筆記,把處理的錯誤或遇到的情況記錄下來,這樣以後再編譯時,會事半功倍!
Ⅵ linux編譯時的錯誤如何解決
你這是進行過從一般用戶到root的轉換,但沒有改變你的真實許可權。通常解決這樣的問題方法很多,其中最快,最簡單的,你可以在進行用戶轉換時用
$su - root
輸root密碼,
這樣,你會完全使用root的許可權。
這個,你可以 去看看不同用戶的bashshell,的文件。
Ⅶ linux上編譯錯誤,不知道為啥
編譯不成功多半軟體功能開關設置及依賴關系不支持。
首先要了解編譯的過程,真正了解了編譯的過程後就可以比較輕松的編譯各種軟體了。
1、configure,可以在configure 執行一下./configure --help來大致了解一下該軟體的一些開關和支持的性能,然後根據使用需要來設置需要開啟的性能和需要關閉的性能,以及需要哪些支持庫等等,然後再指定一下編譯路徑,做完這一切後,滿屏幕的check ....就開始了,這就是configrue的過程,和所做的事情
2、make,其實這一步才是真正的編輯步驟,而configure只是做一個環境的check,檢查系統環境及lib是不是對上一步所開啟的參數支持,只有check不出錯,也就是configure不出錯,就可以比較順利的進行編譯也就是make
Ⅷ linux內核編譯錯誤 本人菜鳥 請高手指教
配置單中對於控制台的配置有誤,添加了多餘的配置導致的。
解決方法:通過make menuconfig 進入配置界面,在Device Drivers->Graphics Support->Console display driver support中去掉VGA text console,保存設置後再編譯就可以了
Ⅸ Linux centos7使用make編譯時報錯,提示C文件初始值設定元素不是常量,請問應該怎麼解決
static const 初始化值必須為常量,就是只能是編譯時就能確定的值,而不是運行時運算出來的值.
得看看makefloatx80是什麼,如果是一個普通函數,那麼出現這個錯誤是應該的.
考慮到是官方庫,可能是使用的編譯器版本不同.
Ⅹ 在linux下編譯python腳本為什麼出現這個錯誤,怎麼回事
有兩種方式:
1、直接使用python
xxxx.py執行。其中python可以寫成python的絕對路徑。使用which
python進行查詢。
2、在文件的頭部(第一行)寫上#!/usr/bin/python2.7,這個地方使用python的絕對路徑,就是上面用which
python查詢來的結果。然後在外面就可以使用./xxx.py執行了。
因為在linux中,python啊shell這些程序都是普通的文本格式,都需要一種程序去解釋執行它。要麼調用的時候指定,要麼在文件頭指定。