簡體   English   中英

Linux 編程:編譯帶有依賴項的代碼

[英]Linux programming: Compile code with dependencies

我是 Linux 編程的新手,是從Michael Kerrisk 的 The Linux Programming Interface 中學習的

我必須編譯我的第一個具有依賴項的程序。

目錄結構:

--linux-programs
  |--seek_io.c
  |--lib
    |--tlpi_hdr.h
    |--error_functions.h
    |--error_functions.c
    |--get_num.h
    |--ename.c.inc

我想編譯seek_io.c程序,在lib目錄下有依賴項,這樣我就可以看到程序是如何工作的。

我嘗試了一些東西,對於它們如何在這個stackoverflow 答案之后工作完全一無所知。 我遇到了各種各樣的錯誤,因為我是 Linux 編程的絕對初學者,而不是編程、linux OS 和 C。


試煉:

gcc -I ./lib/ -c ./lib/error_functions.c然后gcc -o seek_io.c ./error_function.o給出錯誤: /usr/lib/gcc/x86_64-linux-gnu/crt1.o: In function _start: (.text+0x20): undefined reference to main collect2: error: ld returned 1 exit status

運行后,在ls我發現我的seek_io.c沒有列出。


基本上這本書的作者對tlpi_hdr.h文件說:

該頭文件包括許多示例程序使用的各種其他頭文件,定義了布爾數據類型,並定義了用於計算兩個數值的最小值和最大值的宏。 使用這個頭文件可以讓我們的示例程序更短一些。


鏈接到上述文件的代碼:

tlpi_hdr.h

error_functions.h

error_functions.c

get_num.h

get_num.c

seek_io.c

問題在於您的第二個gcc命令,您在其中使用-o文件來指定輸出文件存儲生成的可執行文件的位置,但將 C 源文件seek_io.c的名稱傳遞給它...

gcc -o seek_io.c ./error_function.o

這意味着鏈接文件error_function.o並將可執行文件存儲在seek_io.c 這將失敗,因為沒有獨立可執行文件所需的main函數,因此您的 C 源文件不會被失敗的鏈接命令覆蓋。

您可以通過向-o選項傳遞正確的輸出文件名來輕松解決此問題,在這種情況下(此鏈接命令)應該是您要創建的可執行文件的名稱,例如seek_io

gcc -o seek_io seek_io.c ./error_function.o

(但是如果沒有-I ./lib/就會失敗,因為seek_io.c包含該目錄中的tlpi_hdr.h 。如果將它添加到該命令中,它應該可以工作。)

您還可以決定將編譯和鏈接步驟分為兩個單獨的步驟(上面的命令都seek_io.c編譯成一個目標文件,然后將兩個目標文件鏈接成一個可執行文件):

$ gcc -I ./lib/ -c ./lib/error_functions.c
$ gcc -I ./lib/ -c seek_io.c
$ gcc -o seek_io seek_io.o error_function.o

最后一個挑剔是-I標志指定搜索包含文件的目錄,更常見的用法是標志本身和目錄名稱之間沒有空格,因此您最常看到的是-I./lib甚至-Ilib

$ gcc -Ilib -c ./lib/error_functions.c
$ gcc -Ilib -c seek_io.c
$ gcc -o seek_io seek_io.o error_function.o

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM