заголовок не работает на веб-сайте, на локальном веб-сервере [дубликат]

Компиляция программы на C ++ выполняется в несколько этапов, как указано в 2.2 (кредиты для Кейта Томпсона для ссылки) :

Превалирование среди правил синтаксиса

  1. Физические символы исходного файла сопоставляются в соответствии с реализацией в соответствии с базовым набором символов источника (ввод символов новой строки для индикаторов конца строки) при необходимости. [SNIP]
  2. Каждый экземпляр символа обратной косой черты (\), за которым сразу следует символ новой строки, удаляется, сплайсируя физические исходные строки для формирования логических строк источника. [SNIP]
  3. Исходный файл разбивается на токены предварительной обработки (2.5) и последовательности символов пробела (включая комментарии). [SNIP]
  4. Выполнены предпроцессорные директивы, макро-вызовы разворачиваются и выполняются операторные выражения _Pragma. [SNIP]
  5. Каждый элемент набора символов в символьном литерале или строковый литерал, а также каждая escape-последовательность и универсальное имя-символа в символьном литерале или не- -raw строковый литерал, преобразуется в соответствующий член набора символов выполнения; [SNIP]
  6. Соединительные маркеры литералов строки объединены.
  7. Символы пробела, разделяющие токены, уже не являются значимыми. Каждый токен предварительной обработки преобразуется в токен. (2.7). Результирующие маркеры синтаксически и семантически анализируются и переводятся как единица перевода. [SNIP]
  8. Устанавливаемые единицы перевода и единицы экземпляра объединяются следующим образом: [SNIP]
  9. Все ссылки на внешние сущности решена. Компоненты библиотеки связаны для удовлетворения внешних ссылок на объекты, не определенные в текущем переводе. Весь такой переводчик выводится в образ программы, который содержит информацию, необходимую для выполнения в среде выполнения. (акцент мой)

[footnote] Реализации должны вести себя так, как если бы эти отдельные фазы происходили, хотя на практике различные фазы могли быть свернуты вместе.

Указанные ошибки возникают на этом последнем этапе компиляции, чаще всего называемом связыванием. Это в основном означает, что вы собрали кучу файлов реализации в объектные файлы или библиотеки, и теперь вы хотите заставить их работать вместе.

Скажите, что вы определили символ a в a.cpp. Теперь b.cpp объявил этот символ и использовал его. Перед связыванием он просто предполагает, что этот символ был определен где-то , но он пока не заботится о том, где. Фаза связывания отвечает за поиск символа и правильную привязку его к b.cpp (ну, собственно, к объекту или библиотеке, которая его использует).

Если вы используете Microsoft Visual Studio, вы будете см., что проекты генерируют файлы .lib. Они содержат таблицу экспортированных символов и таблицу импортированных символов. Импортированные символы разрешены против библиотек, на которые вы ссылаетесь, и экспортированные символы предоставляются для библиотек, которые используют этот .lib (если есть).

Подобные механизмы существуют для других компиляторов / платформ.

Общие сообщения об ошибках: error LNK2001, error LNK1120, error LNK2019 для Microsoft Visual Studio и undefined reference to symbolName для GCC.

Код:

struct X
{
   virtual void foo();
};
struct Y : X
{
   void foo() {}
};
struct A
{
   virtual ~A() = 0;
};
struct B: A
{
   virtual ~B(){}
};
extern int x;
void foo();
int main()
{
   x = 0;
   foo();
   Y y;
   B b;
}

генерирует следующие ошибки с GCC:

/home/AbiSfw/ccvvuHoX.o: In function `main':
prog.cpp:(.text+0x10): undefined reference to `x'
prog.cpp:(.text+0x19): undefined reference to `foo()'
prog.cpp:(.text+0x2d): undefined reference to `A::~A()'
/home/AbiSfw/ccvvuHoX.o: In function `B::~B()':
prog.cpp:(.text._ZN1BD1Ev[B::~B()]+0xb): undefined reference to `A::~A()'
/home/AbiSfw/ccvvuHoX.o: In function `B::~B()':
prog.cpp:(.text._ZN1BD0Ev[B::~B()]+0x12): undefined reference to `A::~A()'
/home/AbiSfw/ccvvuHoX.o:(.rodata._ZTI1Y[typeinfo for Y]+0x8): undefined reference to `typeinfo for X'
/home/AbiSfw/ccvvuHoX.o:(.rodata._ZTI1B[typeinfo for B]+0x8): undefined reference to `typeinfo for A'
collect2: ld returned 1 exit status

и аналогичные ошибки с Microsoft Visual Studio:

1>test2.obj : error LNK2001: unresolved external symbol "void __cdecl foo(void)" (?foo@@YAXXZ)
1>test2.obj : error LNK2001: unresolved external symbol "int x" (?x@@3HA)
1>test2.obj : error LNK2001: unresolved external symbol "public: virtual __thiscall A::~A(void)" (??1A@@UAE@XZ)
1>test2.obj : error LNK2001: unresolved external symbol "public: virtual void __thiscall X::foo(void)" (?foo@X@@UAEXXZ)
1>...\test2.exe : fatal error LNK1120: 4 unresolved externals

. Общие причины включают в себя:

836
задан 16 revs, 8 users 46% 16 January 2014 в 19:41
поделиться

11 ответов

2660
ответ дан Community 26 August 2018 в 15:10
поделиться

Иногда, когда в процессе dev есть обе рабочие станции WIN и системы LINUX (хостинг), а в коде вы не видите никакого вывода перед соответствующей строкой, это может быть форматирование файла и отсутствие Unix LF (linefeed) заканчивается.

Что мы обычно делаем, чтобы быстро исправить это, переименуйте файл, а в системе LINUX создайте новый файл вместо переименованного, а затем скопируйте его в него. Во многих случаях это решает проблему, так как некоторые из файлов, которые были созданы в WIN, когда-то перемещенные на хостинг, вызывают эту проблему.

Это исправление - это легкое исправление для сайтов, которыми мы управляем по FTP, и иногда может спасти наш новый членов команды некоторое время.

14
ответ дан 2 revs, 2 users 91% 26 August 2018 в 15:10
поделиться

Обычно эта ошибка возникает, когда мы отправляем заголовок после эха или печати. Если эта ошибка возникает на определенной странице, убедитесь, что страница не выполняет эхо-сигналы перед вызовом start_session().

Пример непредсказуемой ошибки:

 <?php //a white-space before <?php also send for output and arise error
session_start();
session_regenerate_id();

//your page content

Еще один пример:

<?php
includes 'functions.php';
?> <!-- This new line will also arise error -->
<?php
session_start();
session_regenerate_id();

//your page content

Вывод: не выводить символ перед тем, как вызывать функции session_start() или header(), даже не с помощью пробела или новой строки

1
ответ дан 2 revs, 2 users 96% 26 August 2018 в 15:10
поделиться
23
ответ дан 4 revs, 3 users 74% 26 August 2018 в 15:10
поделиться

Другая неудачная практика может вызвать эту проблему, которая еще не указана.

См. этот фрагмент кода:

<?php
include('a_important_file.php'); //really really really bad practise
header("Location:A location");
?>

Все в порядке, верно?

Что делать, если «a_important_file.php»:

<?php
//some php code 
//another line of php code
//no line above is generating any output
?>

 ----------This is the end of the an_important_file-------------------

Это не сработает? Почему? Потому что уже создана новая строка.

Теперь, хотя это не общий сценарий, что, если вы используете структуру MVC, которая загружает большое количество файлов перед передачей данных на ваш контроллер? Это не необычный сценарий. Будьте готовы к этому.

Из PSR-2 2.2:


  • Все файлы PHP ДОЛЖНЫ использовать Unix LF (linefeed) line ending .
  • Все файлы PHP ДОЛЖНЫ заканчиваться на single blank line.
  • Тег закрытия?> ДОЛЖЕН быть omitted из файлов, содержащих only php

Поверьте, следующие стандарты могут сэкономить вам много часов из вашей жизни:)

20
ответ дан MD. Sahib Bin Mahboob 26 August 2018 в 15:10
поделиться

Это сообщение об ошибке запускается, когда отправляется сообщение перед отправкой заголовков HTTP (с помощью setcookie или header ). Общие причины вывода чего-либо перед заголовками HTTP:

  • Случайные пробелы, часто в начале или в конце файлов, например:
     <?php
    // Note the space before "<?php"
    ?>
    

& nbsp; & nbsp; & nbsp; & nbsp; & nbsp; & nbsp; & nbsp; & nbsp; & nbsp; & nbsp; Чтобы избежать этого, просто оставьте закрытие ?> - это не обязательно. g2] в начале файла php. Изучите ваши php-файлы с помощью шестнадцатеричного редактора, чтобы узнать, так ли это. Они должны начинаться с байтов 3F 3C. Вы можете безопасно удалить спецификацию EF BB BF с начала файлов.

  • Явный вывод, например вызовы echo, printf, readfile, passthru, код до <? и т. д.
  • Предупреждение, выданное php, если установлено свойство display_errors php.ini. Вместо того, чтобы сбой при ошибке программиста, php молча фиксирует ошибку и выдает предупреждение. Хотя вы можете изменить конфигурации display_errors или error_reporting , вы должны скорее исправить эту проблему. Основными причинами являются доступ к неопределенным элементам массива (например, $_POST['input'] без использования empty или isset , чтобы проверить, установлен ли вход) или используя неопределенная константа вместо строкового литерала (как в $_POST[input], обратите внимание на недостающие кавычки).
  • Включение буферизации вывода должно устранить проблему; все выходные данные после вызова ob_start буферизуются в памяти до тех пор, пока вы не отпустите буфер, например. с ob_end_flush .

    Однако, хотя буферизация вывода исключает проблемы, вы должны действительно определить, почему ваше приложение выводит тело HTTP перед заголовком HTTP. Это будет похоже на телефонный звонок и обсуждение вашего дня и погоды, прежде чем сообщить вызывающему, что у него неправильный номер.

    178
    ответ дан NikiC 26 August 2018 в 15:10
    поделиться

    Простой совет: простое пространство (или невидимый специальный символ) в вашем скрипте, прямо перед самым первым тегом <?php, может вызвать это! Особенно, когда вы работаете в команде, а кто-то использует «слабую» IDE или перепутал файлы со странными текстовыми редакторами.

    Я видел эти вещи;)

    25
    ответ дан PeeHaa 26 August 2018 в 15:10
    поделиться

    Это из-за этой строки:

    printf ("Hi %s,</br />", $name);
    

    Вы не должны печатать / эхо ничего, прежде чем отправлять заголовки.

    29
    ответ дан Sarfraz 26 August 2018 в 15:10
    поделиться

    Вы делаете

    printf ("Hi %s,</br />", $name);
    

    перед установкой файлов cookie, что запрещено. Вы не можете отправить какой-либо вывод перед заголовками, даже пустую строку.

    38
    ответ дан Seth Carnegie 26 August 2018 в 15:10
    поделиться

    Я получил эту ошибку много раз раньше. И я уверен, что все программисты PHP по крайней мере однажды получили эту ошибку. Чтобы решить эту ошибку, вы можете решить использовать решение по вашему уровню проблемы:

    Возможное решение 1:

    Возможно, вы оставили пробелы до или после (в конце файла после?>) ie

    THERE SHOULD BE NO BLANK SPACES HERE
    <?php  
    
       echo "your code here";
    
    ?>
    DO CHECK FOR BLANK SPACES HERE AS WELL; THIS LINE (blank line) SHOULD NOT EXIST.
    

    В большинстве случаев это должно решить вашу проблему. Проверьте все файлы, связанные с файлом require.

    Примечание: Иногда EDITOR (IDE), например gedit (редактор linux по умолчанию), добавляет одну пустую строку в файл save save. Этого не должно быть. Если вы используете linux. вы можете использовать редактор VI для удаления пробела / строк после?> в конце страницы.

    Если это не ваш случай, тогда вы можете использовать ob_start для буферизации вывода, как показано ниже:

    Возможное решение 2:

    <?php
      ob_start();
    
      // code 
    
     ob_end_flush();
    ?> 
    

    Это приведет к буферизации вывода и ваши заголовки будут созданы после буферизации страницы.

    102
    ответ дан T.Todua 26 August 2018 в 15:10
    поделиться

    Вместо нижней строки

    //header("Location:".ADMIN_URL."/index.php");
    

    напишите

    echo("<script>location.href = '".ADMIN_URL."/index.php?msg=$msg';</script>");
    

    или

    ?><script><?php echo("location.href = '".ADMIN_URL."/index.php?msg=$msg';");?></script><?php
    

    Это определенно решит вашу проблему. Я столкнулся с одной и той же проблемой, но решил решить эту проблему путем написания заголовка.

    73
    ответ дан Yogesh Suthar 26 August 2018 в 15:10
    поделиться
    Другие вопросы по тегам:

    Похожие вопросы: