在PHP脚本,调用是否include(),require(),fopen(),或它们的衍生物,例如include_once,require_once或者甚至move_uploaded_file(),一个经常遇到错误或警告:
无法打开流:没有这样的文件或目录.
快速找到问题根本原因的好过程是什么?
当我使用gcc编译一个非常简单的源文件时,我不必指定标准包含文件的路径,例如stdio或stdlib.
GCC如何知道如何找到这些文件?
它是否在/usr/include内部硬连线,或者它将从其他OS组件获取路径?
我正在使用pip并尝试安装一个名为pyodbc的python模块,它对unixodbc-dev,unixodbc-bin,unixodbc等非python库有一些依赖性.我目前无法在系统中安装这些依赖项,因为我只是在玩,所以我已将它们安装在非标准位置.我如何告诉pip在哪里寻找这些依赖项?更确切地说,如何通过包含dirs(gcc -I)和库dirs(gcc -L -l)的pip来传递信息,以便在构建pyodbc扩展时使用?
错误如上.我应该在eclipse项目中包含所有必需的文件:
/usr/include/c++/4.6
/usr/include
/usr/include/linux
/usr/local/include
Run Code Online (Sandbox Code Playgroud)
等等
我尝试了std::cout,using namespace std; cout但它仍然没有解决.
我有进口iostream和cstdlib.
另外,我在Ubuntu 12.04上使用eclipse 3.7.2.
代码段:
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <iostream>
#include "XPLMDisplay.h"
#include "XPLMGraphics.h"
int XPluginStart(char * outName, char * outSig, char * outDesc) {
/* ... */
std::cout << "test" << std::endl;
/* ... */
}
Run Code Online (Sandbox Code Playgroud)
using namespace std;
更新:我从现有代码创建了eclipse项目.创建一个新的c ++项目可以修复它.我会接受一个解释,解释现有项目中的设置可能导致这种情况(因此我不必剪切和粘贴所有项目).
我刚刚在使用Windows 10的工作笔记本电脑上安装了Visual Studio 2015.
我已经克隆了一个存储库,其中包含使用相同版本的Visual Studio(更新3)在另一台PC上创建的解决方案,始终使用Windows 10.
当我尝试在笔记本电脑上构建解决方案时,我收到以下错误:
c:\program files (x86)\microsoft visual studio 14.0\vc\include\crtdefs.h(10): fatal error C1083: Cannot open include file: 'corecrt.h': No such file or directory
Run Code Online (Sandbox Code Playgroud)
在这个页面中,我已经读过我必须添加$(UniversalCRT_IncludePath)到我的包含路径,但即使在这种情况下,我也会获得相同的错误.
我已经检查并$(UniversalCRT_IncludePath)引用了这条路径:
C:\Program Files (x86)\Windows Kits\10\Include\10.0.10240.0\ucrt
Run Code Online (Sandbox Code Playgroud)
笔记本电脑上缺少此路径.相反,我有这个:
C:\Program Files (x86)\Windows Kits\10\Include\10.0.10150.0\ucrt
Run Code Online (Sandbox Code Playgroud)
所以看起来窗口版本是不同的.可能这是真的,因为在我的笔记本电脑上我没有安装1511 windows升级,而在另一台电脑上都安装正确.
我的问题是如何corecrt.h在不弄乱路径的情况下在两个pc中引用文件.我想避免硬连接这些路径,因为它们依赖于pc.而且我不明白为什么在我的笔记本电脑中路径是错误的,因为它应该是系统相关的而不是连接到解决方案中.
我该如何解决这个问题?我知道我可以将我的笔记本电脑更新到相同的Windows版本,但我想避免它出于很多原因.
- 编辑
我注意到我有这条道路:
C:\Program Files (x86)\Windows Kits\8.1\Include\10.0.10240.0\ucrt
Run Code Online (Sandbox Code Playgroud)
它具有相同的10.0.10240.0版本,但与另一个Windows工具包版本相关,所以在这种情况下可能存在一些问题.在我的笔记本电脑上我也是Visual Studio 2013,所以也许它可以来自它,但我无法删除它,因为我正在使用Visual Studio 2013维护另一个项目,我还无法删除它.
也许在Visual Studio 2015文件夹中我可以$(UniversalCRT_IncludePath)在一些.bat文件中明确设置(vcvarsall.bat或类似),但我不知道哪个文件和位置.
我有一个项目(一个库),它被细分为几个包含代码的目录.我想在项目的根目录中使用g ++搜索头文件,因此我可以避免跨多个源文件的相同头文件的不同包含路径.
主要是,该root/目录有子目录A/,B/并且C/,所有这些都.hpp和.cpp里面的文件.如果A中的某个源文件想包含file.hpp在B中,那么就必须这样做:#include "../B/file.hpp".对于C中的另一个源文件也是如此.但是,如果A本身具有需要文件的子目录file.hpp,那么它将是不一致的并且如果我决定移动文件会导致错误(因为包含路径将是"../../B/file.hpp").
此外,这还需要在其他项目中工作,这些项目位于其他项目之外root/.我已经知道有一个选项可以手动将我的所有头文件复制到默认搜索目录中,但我想按照我描述的方式执行此操作.
编辑:使用该库的所有程序必须仅使用g++ prog.cpp lib.a -o prog.这意味着永久设置g ++的包含路径!
-I在GCC中读取开关的精细打印,我很震惊地发现在命令行上使用它会覆盖系统包含.来自预处理器文档
"您可以使用
-I覆盖系统头文件,替换您自己的版本,因为这些目录是在标准系统头文件目录之前搜索的."
他们似乎并不撒谎.在具有GCC 7的两个不同的Ubuntu系统上,如果我创建一个文件endian.h:
#error "This endian.h shouldn't be included"
Run Code Online (Sandbox Code Playgroud)
...然后在同一目录中创建一个main.cpp(或main.c,相同的区别):
#include <stdlib.h>
int main() {}
Run Code Online (Sandbox Code Playgroud)
然后编译g++ main.cpp -I. -o main(或clang,相同的差异)给我:
In file included from /usr/include/x86_64-linux-gnu/sys/types.h:194:0,
from /usr/include/stdlib.h:394,
from /usr/include/c++/7/cstdlib:75,
from /usr/include/c++/7/stdlib.h:36,
from main.cpp:1:
./endian.h:1:2: error: #error "This endian.h shouldn't be included"
Run Code Online (Sandbox Code Playgroud)
所以stdlib.h包含了这个types.h文件,在194行就是这么说的#include <endian.h>.我明显的误解(也许是其他人的误解)是尖括号会阻止这一点,但是 - 我比我想象的更强.
虽然不强足够在命令行上,因为你甚至不能通过症结修复/ usr/include目录在第一位,这是因为:
"如果标准系统包括目录或指定的目录
-isystem,也指定了-I,-I则忽略该选项.目录仍然被搜索,但作为系统目录在系统包含链中的正常位置."
实际上,g++ -v main.cpp -I/usr/include -I. -o mainleaves/usr/的详细输出包含在列表的底部:
#include "..." …Run Code Online (Sandbox Code Playgroud) 目前在我的网站上我使用的语句如下:
include 'head.php';
include '../head.php';
include '../../head.php';
Run Code Online (Sandbox Code Playgroud)
取决于我有多少嵌套文件夹.我确信有更好的方法可以做到这一点.
我确信这.htaccess是解决方案,但我不确定如何实施它.如果我插入:
php_value include_path "public/html/root"
Run Code Online (Sandbox Code Playgroud)
......我失去了其余的路径(/usr/lib/php等等).我天真地尝试过:
php_value include_path $include_path . "(path)"
Run Code Online (Sandbox Code Playgroud)
但当然这没用.我怎么能在这个列表中添加或附加单个路径.htaccess?
所以,检查这个目录结构
假设我在/directory/main_file.php中并且我include('../include_one.php');在include_one.php中调用,以包含include_two.php.我需要打电话include('include_two.php);还是include('../include_two.php');?
所以我的问题是:当包含文件时,"相对包含路径"是否转移到包含文件,还是保留在主包含文件中?
我知道最好的选择是拥有一个包含root_path的config.php,但是在这个阶段这是不可能的.
目录结构
/include.php
/start/start.php
/folder1/includeone.php
/folder1/folder2/includetwo.php
这是每个文件的内容
start.php
<?php
echo 'including ../include.php<br />';
include('../include.php');
?>
Run Code Online (Sandbox Code Playgroud)
include.php
<?php
echo 'including folder1/includeone.php<br />';
include('folder1/includeone.php');
?>
Run Code Online (Sandbox Code Playgroud)
includeone.php
<?php
echo 'including folder2/includetwo.php<br />';
include('folder2/includetwo.php');
?>
Run Code Online (Sandbox Code Playgroud)
includetwo.php
<?php
echo 'done<br />';
?>
Run Code Online (Sandbox Code Playgroud)
而输出是
包括../include.php
包括folder1/includeone.php,
包括folder2/includetwo.php
完成
我的包含文件有问题.当我使用require_once('somefile.php')时,我似乎无法弄清楚如何构建我的URL.如果我尝试在目录结构不同的多个地方使用包含文件,则会收到无法找到包含文件的错误.
在asp.net中,要获取我的应用程序根路径,我可以使用〜/ directory/file.aspx.tild正斜杠总是知道我从我的网站根目录引用并找到该文件,无论我的网站中的请求来自何处.它总是返回根并从那里查找文件.
问题:如何获取我网站的根路径?我该怎么做才能在网站的任何地方重用我的包含文件?我必须在网址中使用绝对路径吗?
谢谢!