Ошибки компоновщика могут произойти, если заголовочный файл и связанная с ним общая библиотека (файл .lib) не синхронизируются. Позволь мне объяснить.
Как работают линкеры? Линкер соответствует объявлению функции (объявленному в заголовке) с его определением (в общей библиотеке) путем сравнения их подписи. Вы можете получить ошибку компоновщика, если компоновщик не найдет определение функции, которое идеально подходит.
Возможно ли получить ошибку компоновщика, даже если объявление и определение, похоже, совпадают? Да! Они могут выглядеть одинаково в исходном коде, но это действительно зависит от того, что видит компилятор. По сути, вы можете столкнуться с такой ситуацией:
// header1.h
typedef int Number;
void foo(Number);
// header2.h
typedef float Number;
void foo(Number); // this only looks the same lexically
Обратите внимание, что хотя обе декларации функций выглядят одинаково в исходном коде, но они действительно различаются в зависимости от компилятора.
Вы можете спросить, как это получается в такой ситуации? Включите пути, конечно! Если при компиляции разделяемой библиотеки путь include приводит к header1.h
, и вы в конечном итоге используете header2.h
в своей собственной программе, вы оставите царапины на своем заголовке, задаваясь вопросом, что произошло (каламбур).
Пример того, как это может произойти в реальном мире, объясняется ниже.
У меня есть два проекта: graphics.lib
и main.exe
. Оба проекта зависят от common_math.h
. Предположим, что библиотека экспортирует следующую функцию:
// graphics.lib
#include "common_math.h"
void draw(vec3 p) { ... } // vec3 comes from common_math.h
И затем вы идете вперед и включаете библиотеку в свой собственный проект.
// main.exe
#include "other/common_math.h"
#include "graphics.h"
int main() {
draw(...);
}
Boom! Вы получаете ошибку компоновщика, и вы понятия не имеете, почему она терпит неудачу. Причина в том, что общая библиотека использует разные версии одного и того же include common_math.h
(я сделал это очевидным здесь в этом примере, включив другой путь, но это может быть не всегда так очевидно. Возможно, путь include отличается в настройки компилятора).
Обратите внимание, что в этом примере компоновщик сказал бы вам, что не смог найти draw()
, когда на самом деле вы знаете, что он явно экспортируется библиотекой. Вы могли часами царапать себе голову, думая, что пошло не так. Дело в том, что компоновщик видит другую подпись, потому что типы параметров немного отличаются. В этом примере vec3
является другим типом в обоих проектах в отношении компилятора. Это может произойти из-за того, что они происходят из двух немного разных файлов include (возможно, включенные файлы поступают из двух разных версий библиотеки).
DUMPBIN - ваш друг, если вы используете Visual Studio. Я уверен, что другие компиляторы имеют другие подобные инструменты.
Процесс выглядит следующим образом:
[1] По проекту я имею в виду набор исходных файлов, которые связаны друг с другом для создания либо библиотеки, либо исполняемого файла .
РЕДАКТИРОВАТЬ 1: Переписать первый раздел, который будет легче понять. Пожалуйста, прокомментируйте ниже, чтобы сообщить мне, нужно ли что-то еще исправлять. Спасибо!
1) Перейдите в папку conf
в каталоге установки tomcat
e.g. C:\Tomcat 6.0\conf\
2) Измените следующий тег в файле server.xml
<Connector connectionTimeout="20000" port="8080" protocol="HTTP/1.1" redirectPort="8443"/>
3) Измените значение port=8080
на port=80
4) Сохраните файл.
5) Остановите Tomcat и перезапустите его.
Я попытался изменить порт с 8080
на 80
в server.xml
, но он не работал для меня. Затем я нашел альтернативу, обновил iptables
, который, несомненно, влияет на производительность.
Я использую следующие команды:
sudo /sbin/iptables -t nat -I PREROUTING -p tcp --dport 80 -j REDIRECT --to-port 8080
sudo /sbin/service iptables save
http: //www.excelsior-usa.com/articles/tomcat-amazon-ec2-advanced.html#port80
В современном Linux лучший подход (для меня) заключается в использовании xinetd:
1) create /etc/xinet.d/tomcat-http
service http
{
disable = no
socket_type = stream
user = root
wait = no
redirect = 127.0.0.1 8080
}
2) create /etc/xinet.d/tomcat-https
service https
{
disable = no
socket_type = stream
user = root
wait = no
redirect = 127.0.0.1 8443
}
3) chkconfig xinetd on
4) /etc/init.d/xinetd start
1) Найдите server.xml в {папке установки Tomcat} \ conf \ 2) Найдите следующую аналогичную инструкцию
<!-- Define a non-SSL HTTP/1.1 Connector on port 8180 -->
<Connector port="8080" maxHttpHeaderSize="8192"
maxThreads="150" minSpareThreads="25" maxSpareThreads="75"
enableLookups="false" redirectPort="8443" acceptCount="100"
connectionTimeout="20000" disableUploadTimeout="true" />
3) теперь измените порт = "---" (что вы хотите )
Вот шаги:
-> Следуйте по пути: {каталог tomcat> / conf -> Найти эту строку:
<Connector port="8080" protocol="HTTP/1.1" connectionTimeout="20000" redirectPort="8443" />
изменить номер порта с "8080 "на" 80 ".
-> Сохранить файл.
-> Перезапустить сервер:)
В Linux на базе Debian (например, в Ubuntu) вы также должны пойти в /etc/default/tomcat7
, раскомментировать строку #AUTHBIND=no
и установить его значение в «да», чтобы сервер связывался с привилегированным портом .
Работа с приведенной ниже командой. Пробовал менять server.xml и файл conf, но оба они не работали.
/ sbin / iptables -A INPUT -i eth0 -p tcp -dport 80 -j ACCEPT
/ sbin / iptables -A INPUT -i eth0 -p tcp --dport 8080 -j ACCEPT
/ sbin / iptables -A PREROUTING -t nat -i eth0 -p tcp -dport 80 -j REDIRECT -to-port 8080
На сервере Linux вы можете просто использовать эти команды для перенастройки Tomcat для прослушивания на порту 80:
sed -i 's|port="8080"|port="80"|g' /etc/tomcat?/server.xml
sed -i 's|#AUTHBIND=no|AUTHBIND=yes|g' /etc/default/tomcat?
service tomcat8 restart
В системах Ubuntu и Debian необходимо выполнить несколько шагов:
<Connector connectionTimeout="20000" port="8080" protocol="HTTP/1.1" redirectPort="8443"/>
на port="80"
. sudo apt-get install authbind
/etc/tomcat6
, либо /etc/tomcat7
), раскомментируя и установив строку как : AUTHBIND=yes
Необходимы все три шага.
Просто перейдите в папку conf из tomcat
откройте файл server.xml
Откройте один из узлов соединителя, который выглядит следующим образом:
<Connector port="8080" protocol="HTTP/1.1"
connectionTimeout="20000"
redirectPort="8443" />
Просто замените порт
сохранить и перезапустить tomcat
Ubuntu 14.04 LTS, в Amazon EC2. Следующие шаги разрешили эту проблему для меня:
1. Измените server.xml и измените порт = "8080" на "80"
sudo vi /var/lib/tomcat7/conf/server.xml
<Connector connectionTimeout="20000" port="8080" protocol="HTTP/1.1" redirectPort="8443"/>
2. Редактировать файл tomcat7
sudo vi /etc/default/tomcat7
раскомментировать и изменить # AUTHBIND = нет для да
3. Установить authbind
sudo apt-get install authbind
4. Выполните следующие команды, чтобы обеспечить чтение и выполнение tomcat7 на порту 80.
sudo touch /etc/authbind/byport/80
sudo chmod 500 /etc/authbind/byport/80
sudo chown tomcat7 /etc/authbind/byport/80
5. Перезапустить tomcat:
sudo /etc/init.d/tomcat7 restart
Если кто-то ищет, как изменить номер порта tomcat в Eclipse IDE, выполните следующие действия.
1. В представлении «Серверы» дважды щелкните имя сервера:
2.Что откроет страницу конфигурации для Tomcat следующим образом:
3.Некоторые номера портов показаны в таблице на правильно. Нажмите, чтобы изменить, например:
4.Что изменит номер порта для HTTP с 8080 до 80. Нажмите Ctrl + S, чтобы сохранить изменения и перезапустить сервер. Мы можем определить изменение номера порта в представлении «Консоль»:
Это все содержимое было взято из приведенной ниже ссылки, пожалуйста, обратитесь к этой ссылке для получения дополнительной информации. http://www.codejava.net/servers/tomcat/how-to-change-port-numbers-for-tomcat-in-eclipse
Поскольку предыдущие ответы не работали хорошо (это было хорошо, но недостаточно) для меня на сервере 14.04 Ubuntu, я упоминаю эти рекомендации (это цитата).
Редактировать: обратите внимание, что как @ jason-faust упомянул об этом в комментариях, в 14.04, пакет authbind
, который поставляется с ним, теперь поддерживает IPv6, поэтому предпочтение IPv4 не является потребовалось больше .
1) Install authbind
2) Make port 80 available to authbind (you need to be root):
touch /etc/authbind/byport/80
chmod 500 /etc/authbind/byport/80
chown tomcat7 /etc/authbind/byport/80
3) Make IPv4 the default (authbind does not currently support IPv6).
To do so, create the file TOMCAT/bin/setenv.sh with the following content:
CATALINA_OPTS="-Djava.net.preferIPv4Stack=true"
4) Change /usr/share/tomcat7/bin/startup.sh
exec authbind --deep "$PRGDIR"/"$EXECUTABLE" start "$@"
# OLD: exec "$PRGDIR"/"$EXECUTABLE" start "$@"
Если у вас уже есть файл setenv.sh
в /usr/share/tomcat7/bin
с CATALINA_OPTS
, вы должны использовать:
export CATALINA_OPTS="$CATALINA_OPTS -Djava.net.preferIPv4Stack=true"
Теперь вы можете изменить порт на 80
, как сказано в других ответах.
Не забудьте отредактировать файл. Откройте файл /etc/default/tomcat7
и измените
#AUTHBIND=no
на
AUTHBIND=yes
, затем перезапустите.
, если вы используете eclipse и модифицируете server.xml, не работает для вас, попробуйте выполнить статью .. У них есть шаги для изменения порта, если вы используете IDE, например eclipse.