java -Djava.library.path=/le_repertoire qui_contient_le_so MaClasse
Sauf que si j'ai bien compris, il trouve sa propre classe. Ce
sont les bibliothèques utilisées par ses classes qui posent le
problème.
Il n'est pas question ici de trouver sa propre classe, mais bien les
bibliothèques native utilisées pas ses classes Java. A moins que tu a is
voulu dire sa propre librairie native. De toutes façons, normalement un
-Djava.library.path (ou un LD_LIBRARY_PATH) correctement positionné
règle ce problème.
Enfin bref, si la ou les librairies sont pointées
correctement, sous Linux c'est impossible que ça ne marche
pas.
Ou alors comme tu l'as dit dans un autre post, c'est qu'il
utilise sous Linux une librairie compilée pour Solaris. Mais
ça paraît tellement incroyable....
Dans ce cas la solution c'est évidemment de compiler sous
Linux.... et ce n'est même pas la peine de regarder la doc de
g++. Spécialement pour ça je veut dire.
java -Djava.library.path=/le_repertoire qui_contient_le_so MaClasse
Sauf que si j'ai bien compris, il trouve sa propre classe. Ce
sont les bibliothèques utilisées par ses classes qui posent le
problème.
Il n'est pas question ici de trouver sa propre classe, mais bien les
bibliothèques native utilisées pas ses classes Java. A moins que tu a is
voulu dire sa propre librairie native. De toutes façons, normalement un
-Djava.library.path (ou un LD_LIBRARY_PATH) correctement positionné
règle ce problème.
Enfin bref, si la ou les librairies sont pointées
correctement, sous Linux c'est impossible que ça ne marche
pas.
Ou alors comme tu l'as dit dans un autre post, c'est qu'il
utilise sous Linux une librairie compilée pour Solaris. Mais
ça paraît tellement incroyable....
Dans ce cas la solution c'est évidemment de compiler sous
Linux.... et ce n'est même pas la peine de regarder la doc de
g++. Spécialement pour ça je veut dire.
java -Djava.library.path=/le_repertoire qui_contient_le_so MaClasse
Sauf que si j'ai bien compris, il trouve sa propre classe. Ce
sont les bibliothèques utilisées par ses classes qui posent le
problème.
Il n'est pas question ici de trouver sa propre classe, mais bien les
bibliothèques native utilisées pas ses classes Java. A moins que tu a is
voulu dire sa propre librairie native. De toutes façons, normalement un
-Djava.library.path (ou un LD_LIBRARY_PATH) correctement positionné
règle ce problème.
Enfin bref, si la ou les librairies sont pointées
correctement, sous Linux c'est impossible que ça ne marche
pas.
Ou alors comme tu l'as dit dans un autre post, c'est qu'il
utilise sous Linux une librairie compilée pour Solaris. Mais
ça paraît tellement incroyable....
Dans ce cas la solution c'est évidemment de compiler sous
Linux.... et ce n'est même pas la peine de regarder la doc de
g++. Spécialement pour ça je veut dire.
Modifier ou positionner le LD_LIBRARY_PATH ne sert à rien (pour le
moment en tout cas), pour la simple est bonne raison que si j'essaye de
faire un executable C++ ça ne fonctionne pas non plus (donc rien à
voir avec le Java).
fournis). Au moment de la compilation, il ne trouve pas les librairies
math_iso.h (ainsi que d'autres librairies).
J'ai cependant une question, est-il possible de compiler un fichier
.cpp pour en faire une dll qui intégrerait en elle toutes les
dépendances possibles afin d'obtenir une unique librairie
Merci encore pour votre aide.
Modifier ou positionner le LD_LIBRARY_PATH ne sert à rien (pour le
moment en tout cas), pour la simple est bonne raison que si j'essaye de
faire un executable C++ ça ne fonctionne pas non plus (donc rien à
voir avec le Java).
fournis). Au moment de la compilation, il ne trouve pas les librairies
math_iso.h (ainsi que d'autres librairies).
J'ai cependant une question, est-il possible de compiler un fichier
.cpp pour en faire une dll qui intégrerait en elle toutes les
dépendances possibles afin d'obtenir une unique librairie
Merci encore pour votre aide.
Modifier ou positionner le LD_LIBRARY_PATH ne sert à rien (pour le
moment en tout cas), pour la simple est bonne raison que si j'essaye de
faire un executable C++ ça ne fonctionne pas non plus (donc rien à
voir avec le Java).
fournis). Au moment de la compilation, il ne trouve pas les librairies
math_iso.h (ainsi que d'autres librairies).
J'ai cependant une question, est-il possible de compiler un fichier
.cpp pour en faire une dll qui intégrerait en elle toutes les
dépendances possibles afin d'obtenir une unique librairie
Merci encore pour votre aide.
Pour commencer, merci à tous pour vos réponses.
Je continue d'avancer dans l'investigation de ce problème.
kanze est certainement la personne la plus proche. Modifier
ou positionner le LD_LIBRARY_PATH ne sert à rien (pour le
moment en tout cas), pour la simple est bonne raison que si
j'essaye de faire un executable C++ ça ne fonctionne pas non
plus (donc rien à voir avec le Java).
Je résume la situation :
Java ---JNI----> C++ (solaris) -----> C++ (linux)
Les librairies C++ fournies par mon client ont visiblement été
compilées sous Linux.
J'essaye pour le moment de les recompiler sous Solaris
(Sparc2.8). Or ces librairies utilisent le package OpenSSL et
notamment les libraires libcrypto.so et libSSL.so. J'ai donc
téléchargé ce package pour permettre l'éxecution.
J'ai tenté de le compiler en modifiant le makefile pour
Solaris (à l'aide des scripts fournis). Au moment de la
compilation, il ne trouve pas les librairies math_iso.h (ainsi
que d'autres librairies). Je découvre en fait que mon
environnement n'est pas vraiment viable pour le développement
C++.
Je vais donc tant bien que mal essayer de trouver toutes les
dépendances et recompiler tout ce bazar.
J'ai cependant une question, est-il possible de compiler un
fichier .cpp pour en faire une dll qui intégrerait en elle
toutes les dépendances possibles afin d'obtenir une unique
librairie (et ce afin de faciliter le déploiement sur d'autres
environnement (qualif, prod)).
Pour commencer, merci à tous pour vos réponses.
Je continue d'avancer dans l'investigation de ce problème.
kanze est certainement la personne la plus proche. Modifier
ou positionner le LD_LIBRARY_PATH ne sert à rien (pour le
moment en tout cas), pour la simple est bonne raison que si
j'essaye de faire un executable C++ ça ne fonctionne pas non
plus (donc rien à voir avec le Java).
Je résume la situation :
Java ---JNI----> C++ (solaris) -----> C++ (linux)
Les librairies C++ fournies par mon client ont visiblement été
compilées sous Linux.
J'essaye pour le moment de les recompiler sous Solaris
(Sparc2.8). Or ces librairies utilisent le package OpenSSL et
notamment les libraires libcrypto.so et libSSL.so. J'ai donc
téléchargé ce package pour permettre l'éxecution.
J'ai tenté de le compiler en modifiant le makefile pour
Solaris (à l'aide des scripts fournis). Au moment de la
compilation, il ne trouve pas les librairies math_iso.h (ainsi
que d'autres librairies). Je découvre en fait que mon
environnement n'est pas vraiment viable pour le développement
C++.
Je vais donc tant bien que mal essayer de trouver toutes les
dépendances et recompiler tout ce bazar.
J'ai cependant une question, est-il possible de compiler un
fichier .cpp pour en faire une dll qui intégrerait en elle
toutes les dépendances possibles afin d'obtenir une unique
librairie (et ce afin de faciliter le déploiement sur d'autres
environnement (qualif, prod)).
Pour commencer, merci à tous pour vos réponses.
Je continue d'avancer dans l'investigation de ce problème.
kanze est certainement la personne la plus proche. Modifier
ou positionner le LD_LIBRARY_PATH ne sert à rien (pour le
moment en tout cas), pour la simple est bonne raison que si
j'essaye de faire un executable C++ ça ne fonctionne pas non
plus (donc rien à voir avec le Java).
Je résume la situation :
Java ---JNI----> C++ (solaris) -----> C++ (linux)
Les librairies C++ fournies par mon client ont visiblement été
compilées sous Linux.
J'essaye pour le moment de les recompiler sous Solaris
(Sparc2.8). Or ces librairies utilisent le package OpenSSL et
notamment les libraires libcrypto.so et libSSL.so. J'ai donc
téléchargé ce package pour permettre l'éxecution.
J'ai tenté de le compiler en modifiant le makefile pour
Solaris (à l'aide des scripts fournis). Au moment de la
compilation, il ne trouve pas les librairies math_iso.h (ainsi
que d'autres librairies). Je découvre en fait que mon
environnement n'est pas vraiment viable pour le développement
C++.
Je vais donc tant bien que mal essayer de trouver toutes les
dépendances et recompiler tout ce bazar.
J'ai cependant une question, est-il possible de compiler un
fichier .cpp pour en faire une dll qui intégrerait en elle
toutes les dépendances possibles afin d'obtenir une unique
librairie (et ce afin de faciliter le déploiement sur d'autres
environnement (qualif, prod)).
Il me semble avoir vu une variable statique dans
l'implémentation de std::string chez g++ (mais dans quelle
version -- je ne m'en souviens plus) qui avail le même nom, ou
un nom semblable, à celui qui lui manque. Du coup, je soupçonne
quelque chose qui sert dans son propre code : soit qu'il ne
trouve pas libstdc++, soit que la version installée n'est pas
compatible avec la version dont il s'est servi pour générer son
code.
Enfin bref, si la ou les librairies sont pointées
correctement, sous Linux c'est impossible que ça ne marche
pas.
Je vois que tu n'as pas beaucoup d'expérience dans le domaine.
Si la bibliothèque n'est pas installée sur la machine
(souvent
le cas de libstdc++.so), tu ne peux pas le rétrouver,
quoique tu
mets dans LD_LIBRARY_PATH.
Et si la version installée n'est pas
compatible avec la version dont tu t'es servi lors de la
génération de ton programme, ça risque de poser des problèmes
aussi.
C'est pourquoi je lie toujours libstdc++ en statique.
Je viens de vérifier sur mes copies des sources de g++. Le
symbole dont il a besoin est bien référencé dans
basic_string.tcc ; il est donc démandé si son code C++ utilise
std::string. Et il est défini dans un fichier string-inst.o, qui
fait bien partie de libstdc++ -- dans libstdc++.so.6.0.7 du g++
4.1.0. Dans libstdc++.so.6.0.3, du g++ 3.4.3, le nom est
légèrement différent. Donc, s'il développe avec g++ 4.1.0, mais
que le g++ installé où le programme tourne est g++ 3.4.3, il
aurait exactement l'erreur qu'il décrit.
Il me semble avoir vu une variable statique dans
l'implémentation de std::string chez g++ (mais dans quelle
version -- je ne m'en souviens plus) qui avail le même nom, ou
un nom semblable, à celui qui lui manque. Du coup, je soupçonne
quelque chose qui sert dans son propre code : soit qu'il ne
trouve pas libstdc++, soit que la version installée n'est pas
compatible avec la version dont il s'est servi pour générer son
code.
Enfin bref, si la ou les librairies sont pointées
correctement, sous Linux c'est impossible que ça ne marche
pas.
Je vois que tu n'as pas beaucoup d'expérience dans le domaine.
Si la bibliothèque n'est pas installée sur la machine
(souvent
le cas de libstdc++.so), tu ne peux pas le rétrouver,
quoique tu
mets dans LD_LIBRARY_PATH.
Et si la version installée n'est pas
compatible avec la version dont tu t'es servi lors de la
génération de ton programme, ça risque de poser des problèmes
aussi.
C'est pourquoi je lie toujours libstdc++ en statique.
Je viens de vérifier sur mes copies des sources de g++. Le
symbole dont il a besoin est bien référencé dans
basic_string.tcc ; il est donc démandé si son code C++ utilise
std::string. Et il est défini dans un fichier string-inst.o, qui
fait bien partie de libstdc++ -- dans libstdc++.so.6.0.7 du g++
4.1.0. Dans libstdc++.so.6.0.3, du g++ 3.4.3, le nom est
légèrement différent. Donc, s'il développe avec g++ 4.1.0, mais
que le g++ installé où le programme tourne est g++ 3.4.3, il
aurait exactement l'erreur qu'il décrit.
Il me semble avoir vu une variable statique dans
l'implémentation de std::string chez g++ (mais dans quelle
version -- je ne m'en souviens plus) qui avail le même nom, ou
un nom semblable, à celui qui lui manque. Du coup, je soupçonne
quelque chose qui sert dans son propre code : soit qu'il ne
trouve pas libstdc++, soit que la version installée n'est pas
compatible avec la version dont il s'est servi pour générer son
code.
Enfin bref, si la ou les librairies sont pointées
correctement, sous Linux c'est impossible que ça ne marche
pas.
Je vois que tu n'as pas beaucoup d'expérience dans le domaine.
Si la bibliothèque n'est pas installée sur la machine
(souvent
le cas de libstdc++.so), tu ne peux pas le rétrouver,
quoique tu
mets dans LD_LIBRARY_PATH.
Et si la version installée n'est pas
compatible avec la version dont tu t'es servi lors de la
génération de ton programme, ça risque de poser des problèmes
aussi.
C'est pourquoi je lie toujours libstdc++ en statique.
Je viens de vérifier sur mes copies des sources de g++. Le
symbole dont il a besoin est bien référencé dans
basic_string.tcc ; il est donc démandé si son code C++ utilise
std::string. Et il est défini dans un fichier string-inst.o, qui
fait bien partie de libstdc++ -- dans libstdc++.so.6.0.7 du g++
4.1.0. Dans libstdc++.so.6.0.3, du g++ 3.4.3, le nom est
légèrement différent. Donc, s'il développe avec g++ 4.1.0, mais
que le g++ installé où le programme tourne est g++ 3.4.3, il
aurait exactement l'erreur qu'il décrit.