vs2013编译apr时遇到的疑难杂症

以下内容转自:http://nohup.yne.fr/2014/07/apache-22-msvc-2013.html

Apache 2.2 & MSVC 2013

La branche 2.2.x du serveur http d’Apache a une importance particulière car mod_perl  y fonctionne correctement ce qui n’est pas le cas avec la nouvelle branche 2.4. Apache 2.2, bien qu'encore supporté, commence à dater. La version 2.2.0 date de décembre 2005. Depuis, les compilateurs ont évolués et des problèmes commencent à apparaitre. C’est le cas avec Visual Studio 2013 et sa « Plateform Toolset v120 ».

Voici ce qu’il faut corriger pour pouvoir compiler le serveur http 2.2 d'Apache avec MSVC 2013.

1) Télécharger

  1. Les sources du serveur http 2.2.xx d’Apache depuis :http://www.apache.org/dist/httpd/ 
  2. Les sources de APR-iconv. Les librairies pcre, APR et AP-utils sont incluses avec les sources de Apache mais pas APR-iconv  car les systèmes Unix fournissent déjà iconv() . Pour Windows ce n’est pas le cas, il faut donc télécharger cette librairie et la mettre dans le répertoire srclib sous le nom apr-iconv (sans aucun numéro de version). On trouve cette librairie ici : https://apr.apache.org/download.cgi 
  3. awk est utilisé pour générer la configuration du serveur (httpd.conf). On peut le télécharger ici  http://sourceforge.net/projects/gnuwin32/files/gawk/ sous le nom de gawk.

 2) Environnement

Le PATH doit inclure un chemin sur awk.exe et sur les binaires de MSVC 
C:\Program Files (x86)\Microsoft Visual Studio 12.0\VC\bin.

Ouvrir une console (cmd) dans le répertoire contenant les sources d'Apache.

Exécuter le script "C:\Program Files (x86)\Microsoft Visual Studio 12.0\VC\vcvarsall.bat"

3) Compiler

Normalement il suffirait de taper la commande
    nmake -f Makefile.win
mais ça ne marche pas car on obtient 5 erreurs du type:

pr_atomic.obj : error LNK2019: unresolved external symbol __InterlockedXxxx referenced in function _apr_atomic_inc32@xx

Les 5 erreurs sont:

Creating library .\Release\libapr-1.lib and object .\Release\libapr-1.exp
apr_atomic.obj : error LNK2019: unresolved external symbol __InterlockedIncrement referenced in function _apr_atomic_inc32@4
apr_atomic.obj : error LNK2019: unresolved external symbol __InterlockedExchangeAdd referenced in function _apr_atomic_add32@8
apr_atomic.obj : error LNK2019: unresolved external symbol __InterlockedExchange referenced in function _apr_atomic_set32@8
apr_atomic.obj : error LNK2019: unresolved external symbol __InterlockedDecrement referenced in function _apr_atomic_dec32@4
apr_atomic.obj : error LNK2019: unresolved external symbol __InterlockedCompareExchange referenced in function _apr_atomic_cas32@12
.\Release\libapr-1.dll : fatal error LNK1120: 5 unresolved externals

NB;  Ce problème n’apparait pas si on génère une version 64 bits d’apache.

4) Error LNK2019

Pour corriger cette erreur  il faut éditer le fichier srclib\apr\atomic\win32\apr_atomic.c et mettre en commentaire (ou supprimer)  tous les casts tel que celui-ci (il y en a 9 en tout) : 

#else
return ( /*(apr_atomic_win32_ptr_ptr_ptr_fn)*/ InterlockedCompareExchange)(mem, with, cmp);
#endif


(apr_atomic_win32_xxxx) est mis en commentaire 10 fois.
NB:  Ceci supprimera les erreurs mais en échange on aura 7 warnings C4047 et 5 warnings C4024 à la compilation.

5) Error LNK2011

A ce stade, si on tentait à nouveau de compiler on obtiendrait cette nouvelle erreur :

adobe-stdenc.obj : error LNK2011: precompiled object not linked in; image may not run
..\Release\iconv\adobe-stdenc.so : fatal error LNK1120: 1 unresolved externals
NMAKE : fatal error U1077: '"C:\Program Files (x86)\Microsoft Visual Studio 12.0\VC\BIN\link.EXE"' : return code '0x460'
Stop.


Cette erreur, de manière générale, vient du fait que
1.    un fichier xxxx.c est compilé pour créer un fichier xxxx.pch, 
2.    ce fichier xxxx.pch est utilisé pour compiler d’autres fichiers .c
3.    au moment de l’édition de lien xxxx.obj n’est pas utilisé
(Détail ici:  http://msdn.microsoft.com/en-us/library/3ay26wa2.aspx)

La solution générique a cette erreur consiste donc à ajouter xxxx.obj à la liste des fichiers obj au moment de l’édition des liens.

Dans le cas de Apache 2.2.x, éditer le fichier srclib\apr-iconv\build\modules.mk.win, localiser cette règle et y ajouter la partie surlignée en vert.

.c{$(OUTPUT_DIR)}.so:
    $(SILENT)cl $(ALL_CFLAGS) /Fo$*.obj /Yuiconv.h /c $<
    $(SILENT)link $(ALL_LDFLAGS) $(MODRES).obj $*.obj $(API_LIBS) /out:$@ \
        /base:@"..\build\BaseAddr.ref",$(@F)


Pour comprendre il faut bien voir que $(ALL_CFLAGS) utilisé à chaque compilation contient ... /Fd$(MODRES).pdb /Fp$(MODRES).pch ...

6) Compiler (pour de bon)

Une fois ces erreurs corrigées on peut lancer depuis la racine des sources
  nmake -f Makefile.win    (pour seulement compiler)
ou
  nmake –f Makefile.win installr     (pour compiler et installer dans C:\Apache22)

Le répertoire d’installation peut être spécifié avec le paramètre INSTDIR

  nmake -f Makefile.win INSTDIR="D:\my\Path\Apache" installr

Regardez les commentaires au début du fichier Makefile.win pour découvrir les différents paramètres pouvant être utilisés  pour customiser la compilation et/ou l’installation.

7) Démarrer le serveur HTTPd

Aller dans le répertoire bin de apache (par défaut C:\Apache22\bin) et exécuter httpd.exe








  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值