1. 程式人生 > >include問題及錯誤解決

include問題及錯誤解決

sudo make時#include "hdfs.h"出現include錯誤

fatal error: hdfs.h: No such file or directory 

#include "hdfs.h"

也就是hdfs.h檔案inclucd不進來

原因:

檔案讀取許可權問題,$HADOOP_HOME/include目錄是使用者bdms安裝的,則另一個普通使用者如guest則不能讀取,即使echo $CLASSPATH有這個目錄。

解決:

使用super使用者source配置檔案,並在super使用者下make

# vi bin/setenv

export CLASSPATH=$CLASSPATH:`$HADOOP_HOME/bin/hadoop classpath --glob`:$HADOOP_HOME/include

# . bin/setenv 

# echo $CLASSPATH

...:/usr/local/java/hadoop-2.6.0/include

g++無法使用數學庫函式,abs() 函式無法找到

同樣的一個原始碼, 如果儲存成c檔案, 用gcc編譯可以通過和使用

如果用g++編譯無法通過. 原因是abs() 函式無法找到? 

解決:

#include <stdlib.h>

C/C++避免同一個檔案被include多次的兩種方式

一種是#ifndef方式,一種是#pragma once方式:

    方式一:
    #ifndef __SOMEFILE_H__
    #define __SOMEFILE_H__
    ... ... // 宣告、定義語句
    #endif


    方式二:

    #pragma once

    ... ... // 宣告、定義語句

   #ifndef的方式受C/C++語言標準支援。它不光可以保證同一個檔案不會被包含多次,也能保證內容完全相同的兩個檔案(或者程式碼片段)不會被不小心同時包含。
    當然,缺點就是如果不同標頭檔案中的巨集名不小心“撞車”,可能就會導致你看到標頭檔案明明存在,編譯器卻硬說找不到宣告的狀況——這種情況有時非常讓人抓狂。
    由於編譯器每次都需要開啟標頭檔案才能判定是否有重複定義,在包含一個檔案的時候,只有開啟這個檔案,根據檔案的保護巨集是否已經被定義來判斷此檔案是否已經被包含過,所以效率相對較低。

因此在編譯大型專案時,ifndef會使得編譯時間相對較長,因此一些編譯器逐漸開始支援#pragma once的方式。

   #pragma once一般由編譯器提供保證:同一個檔案不會被包含多次。注意這裡所說的“同一個檔案”是指物理上的一個檔案,而不是指內容相同的兩個檔案。你無法對一個頭檔案中的一段程式碼作pragma once宣告,而只能針對檔案。

   效率更高:因為不需要去開啟包含的檔案,就可以判斷這個檔案有沒有被包含,當然這個工作是系統幫我們完成的。

    其好處是,你不必再費勁想個巨集名了,當然也就不會出現巨集名碰撞引發的奇怪問題。大型專案的編譯速度也因此提高了一些。
    對應的缺點就是如果某個標頭檔案有多份拷貝,本方法不能保證他們不被重複包含。當然,相比巨集名碰撞引發的“找不到宣告”的問題,這種重複包含很容易被發現並修正。

    #pragma once方式產生於#ifndef之後,目前看來#ifndef更受到推崇。因為#ifndef受C/C++語言標準的支援,不受編譯器的任何限制;而#pragma once方式卻不受一些較老版本的編譯器支援,一些支援了的編譯器又打算去掉它,所以它的相容性可能不夠好。一般而言,當程式設計師聽到這樣的話,都會選擇#ifndef方式,為了努力使得自己的程式碼“存活”時間更久,通常寧願降低一些編譯效能。

還有一種用法是把兩者放在一起的:

    #pragma once
    #ifndef __SOMEFILE_H__
    #define __SOMEFILE_H__
    ... ... // 宣告、定義語句
    #endif

    看起來似乎是想兼有兩者的優點。不過只要使用了#ifndef就會有巨集名衝突的危險,也無法避免不支援#pragma once的編譯器報錯,所以混用兩種方法似乎不能帶來更多的好處,倒是會讓一些不熟悉的人感到困惑。

在#include的時候,程式設計師也可以自己判斷所要包含的檔案的保護巨集是否已經被定義,來決定是否要包含這個檔案。類似下面的程式碼:

  1. #ifndef FILE_H_
  2.     #include "file.h"
  3. #endif
這樣作可以得到較高的效率,而且保證可移植性。但是檔案之間的依賴性較高,如果一個檔案的保護巨集改變的話,所有使用如上形式包含這個檔案的檔案都要修改,有悖於模組化的思想。

附:如何保證使用的識別符號在其他地方沒有使用過?

   /* things.h */
#ifndef THINGS_H_
        #define THINGS_H_
        ...
#endif

     通常編譯器提供商採用如下方法:用檔名作為識別符號,並在檔名中使用大寫字母。用下劃線代替檔名中的句點符號,用下劃線(可能兩條下劃線)作字首和字尾。

     所以,為了避免跟編譯器提供的標頭檔案相沖突,採取的方法是把編譯器識別符號去掉字首,也就是字首不用下劃線,其他按照編譯器的方法。上面的示例就是採用的這種方法。

[http://blog.csdn.net/holybin/article/details/28397157

http://zhangzhiyin1982.blog.163.com/blog/static/2899121720076259553175/

http://blog.csdn.net/hkx1n/article/details/4313303]

ref:

相關推薦

include問題錯誤解決

sudo make時#include "hdfs.h"出現include錯誤 fatal error: hdfs.h: No such file or directory  #include "hdfs.h" 也就是hdfs.h檔案inclucd不進來 原因: 檔案讀取許

Ubuntu10.04 編譯並安裝Linux 內核2.6.32.60版本錯誤解決

fdisk命令 prop 這一 boot 虛擬 相關 uuid 電源 linux分區 本文主要是寫給內核學習新手的,主要是在VMWare虛擬機上進行操作。 首先安裝對應版本的編譯工具鏈。 下面進行編譯和安裝。 1.首先解壓源碼。 2.使用cp命令把解壓之後的源碼復制到 /u

CentOS 7安裝Samba 4.6 版本步驟錯誤解決方法

style chmod tab root 必須 共享文件夾 默認 mini div 首先通過這次教訓,讓我養成一個好習慣:備份 備份 備份 不管做什麽配置或者更改什麽東西之前先做好備份! 還有我本身的一個壞毛病:眼高手低! 工廠有一臺服務器,由以前的運維裝的S

linux下openoffice安裝錯誤解決

標題linux下openoffice安裝及錯誤解決 (1)下載: 可以在windows下載然後拖到linux解壓(我用的這個) 網址:http://www.openoffice.org/download/index.html,下載適合你版本的 liunx下載命令:wget https

redis-4.0.0叢集操作步驟錯誤解決

1.複製6份成功安裝的redis-4.0.0到redis-cluster目錄下(命令:cp -r redis redis-cluster/redis01 -p):如圖 2.分別修改6份redis的配置檔案redis.conf(命令vim redis01/bin/redis

CentOS pure-ftpd配置錯誤解決

使用yum安裝pure-ftpd 安裝epel源 # yum install epel-release 使用yum命令安裝Pure-ftpd # yum install pure-ftpd 配置Pure-ftpd # vim /etc/pure-ftpd/pure-ftpd.conf # 1.

npm使用錯誤解決

1、版本修改 命令: npm install [email protected]版本號 -g 2、安裝淘寶映象 npm install -g cnpm --registry=https://registry.npm.taobao.org 3、node-sass安裝失敗 主要是windows

VMware虛擬機器安裝Ubuntu的詳細過程錯誤解決方案(多圖解)

Introduction 不是每一個程式設計師都必須玩過linux,只是博主覺得現在的很多伺服器都是linux系統的,而自己屬於那種前端也搞,後臺也搞,對框架搭建也感興趣,但是很多生產上的框架和工具都是安裝在伺服器上的,而且有不少大公司都要求熟悉在linux上

protobuf安裝、配置錯誤解決

protobuf配置:https://blog.csdn.net/u012477435/article/details/80765005 安裝錯誤解決:https://blog.csdn.net/legend18/article/details/49840607   配置步驟:

linux JDK與Tomcat安裝錯誤解決方案

1.上傳jdk-6u17-linux-i586.bin和apache-tomcat-6.0.20.tar.gz到/usr 2.安裝JDK $chmod a+x jdk-6u17-linux-i586.bin $ ./jdk-6u17-linux-i586.bin $ vi

Windows安裝TensorFlow方法,錯誤解決方案

1. 首先下載anaconda 點我跳轉,另外注意選擇選擇x64 還是x32 版本的anaconda (此時你會遇到一個大坑,python版本問題,本人在Windows和ubuntu下均安裝TensorFlow失敗,均是此問題造成,下文將詳細給出解決方法) 在安裝過程中,會出現一個opt

sendmail 配置錯誤解決辦法

error:Real domain name required for sender address。 原因是因為hostname不對,不能是localhost.localdomain。 修改:hostname -v lucifo。 /etc/hosts 中一定是127.0.

Linux下GeekOS開發流程錯誤解決

編譯GeekOS: 開啟終端,依次輸入下面三條命令。 cd ~/geekos-0.3.0/src/project0/build/ 注意:~不能少,~表示當前使用者的主目錄。 make bochs可能會出現的問題1、第一次make的時候會出現這個錯誤../include/ge

Busybox 1.17.4 編譯錯誤解決方案

2.1 Makefile中新增編譯工具:#vim Makefile找到OSS_COMPILE ?=修改為:CROSS_COMPILE=/usr/local/arm/3.4.1/bin/arm-linux-也可以執行make menuconfig,進入配置介面來配置,這樣做的

zmap原始碼編譯安裝流程錯誤解決方案

參考官方給出的方案在這裡,事實上針對ubuntu我們要進行一些調整。 注意:以下命令均進行在root許可權下 我的安裝環境:ubuntu12.04+zmap2.1.0 安裝依賴包 apt-

centos5.x,6.x上的VPN架設錯誤解決

配置完成之後我們可以啟動vpn啦,#service pptpd start ; 應該沒有什麼問題之後我們暫時關閉一下防火牆,看看能不能登入vpn,為什麼要關閉防火牆呢,因為這個時候我們還沒有配置防火牆,1723埠還沒有開所以你連不進來,我們先關掉一下。#service iptables stop。 使用win

安裝docker步驟錯誤解決方案

第一步:yum install -y docker 第二步:檢視安裝版本   docker version 第三步:啟動docker systemctl start docker 錯誤資訊:Job for docker.service failed bec

tf.nn.rnn_cell.MultiRNNCell的應用示例錯誤解決

 TensorFlow中,tf.nn.rnn_cell.BasicRNNCell和tf.nn.rnn_cell.Basic LSTM是迴圈神經網路的兩個重要基礎類;tf.nn.dynamic_rnn是用來一次執行多個時間步,tf.nn.rnn_cell.MultiRNNCel

Eclipse中建立web專案步驟錯誤解決方法

    關於web專案,我們可以用My Eclipse建立也可用Eclipse等一些IDE,My Eclipse中環境外掛都已經整合完畢,不用自己安裝外掛,屬於簡單操作容易上手。但Eclipse中,要想寫web專案需要自己配置外掛。一、Eclipse中已有Web外掛的   

創建maven項目卡住錯誤解決辦法

known nat jdom trace esc rate clas bsh common 第一次通過命令行創建maven項目。結果,果不其然啊,還是出問題了,不過出問題比沒有出問題強,知道哪裏有問題並學會解決也是一種收獲。 遇到的第一個問題,在從倉庫下載東西的時候會卡住