[英]autoconf configure results in C std lib header related compile errors
我正在嘗試構建一個帶有automake / autoconf構建系統的項目。 這是一個很常用的項目,所以我對配置腳本,makefile或代碼的問題持懷疑態度。 它可能是某種環境,路徑,標志等問題 - 在我的最終只需使用正確的參數運行正確的命令。
配置步驟似乎以令人滿意的方式完成。 當我運行make時,我會看到一組主要是這些類型的錯誤:
error: ‘TRUE’ undeclared here (not in a function)
error: ‘struct work’ has no member named ‘version’
error: expected ‘)’ before ‘PRIu64’
讓我們關注最后一個,我花時間研究 - 我懷疑所有錯誤都與缺少定義有關。 顯然,找不到C標准庫頭文件inttypes.h中的打印友好擴展定義。 但是,在配置步驟中,聲稱所有內容都按順序排列:
configure:4930: checking for inttypes.h
configure:4930: /usr/bin/x86_64-linux-gnu-gcc -c -g -O2 conftest.c >&5
configure:4930: $? = 0
configure:4930: result: yes
如果我查看confdefs.h,config.h,config.log輸出變量等,所有INTTYPES標志都設置正確:
HAVE_INTTYPES_H='1'
#define HAVE_INTTYPES_H 1
無論是進行本機構建還是交叉編譯(對於arm-linux-gnueabihf,又名armhf),問題都是一樣的。
有問題的源.c文件確實包含了config.h,正如您所期望的那樣,根據我的理解,通過m4宏機制應該添加一個
#include <inttypes.h>
線。 是的,正如您可能傾向於問的那樣,如果我將此行輸入到.c文件中,它似乎正常工作,並且PRIu64錯誤消失了。
我不知道如何調試這類問題 - 基本上,我所知道的一切都告訴我,我已經完成了配置,但我留下了一個虛假的制作過程 。 除了嘗試我能找到的每個./configure調整和技巧之外,我已經開始查看自動生成的Makefile.in本身,但到目前為止還沒有。 另外看看我如何讓C預處理器告訴我它實際插入了哪些頭文件。
編輯:我已通過configure,config.log,Makefile等確認-DHAVE_CONFIG_H機制看起來不錯。
autoconf不會自動生成#include
指令。 您需要基於HAVE_*
宏自行完成此HAVE_*
。 所以你必須添加這樣的東西:
#ifdef HAVE_INTTYPES_H
# include <inttypes.h>
#endif
如果這些行顯示在confdefs.h
( configure
腳本使用的臨時頭文件)中,這confdefs.h
您的應用程序執行這些#include
。 如果configure
將它們寫入confdefs.h
,這僅僅是為了其他configure
測試的好處,而不是為了應用程序使用。
首先,為失敗的目標運行make -n
。 這可能是一些.o
文件; 你可能需要一些調整來正確地獲得它的路徑。
現在您擁有用於編譯文件的命令。 如果通過調試此命令沒有找到問題,請嘗試運行它,添加-E
以強制預處理器輸出文本而不是調用編譯器。
請注意,現在.o
文件將是文本,您必須在不使用-E
情況下重建它。
您可能會發現一些預處理程序標志可用於獲取更多詳細信息: -dM或-dD或其他。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.