CMake “TARGET_LINK_LIBRARIES ne peut pas trouver-lfoo” mais c'est dans le même répertoire que d'une autre bibliothèque
Comme mentionné ci-dessus j'ai des problèmes avec la compilation de mon projet c++ (en utilisant CMake) qui utilise des bibliothèques dynamiques (.donc).
Il y a 3 libs dans mon répertoire (c'est à dire home/sources/lib/
). Quand je ne fais qu'informer le compilateur (dans le fichier CMake) pour utiliser la première lib ( foo1.so
), il fonctionne (uniquement ce fichier, l'ordre n'a pas d'importance). Mais il ne fonctionne pas avec tout les autres libs (foo2.so
et foo2.so
). Tous les 3 fichiers ont le .afin d'extension.
Remarque: Le répertoire et les noms de fichiers ont été modifiés, mais la structure est la même.
Les bibliothèques que j'utilise n'ont pas été compilées /créé par moi et sont d'un 3ème partie. (il n'aurait pas d'importance quand ils sont cassés, le serait-il?)
Et c'est ainsi que ma CMake fichier ressemble à ceci:
cmake_minimum_required(VERSION 3.3)
project(MyProj)
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++11 -pthread -m64")
INCLUDE_DIRECTORIES("/home/sources/include")
LINK_DIRECTORIES("/home/sources/lib")
set(SOURCE_FILES main.cpp)
add_executable(MyProj ${SOURCE_FILES})
TARGET_LINK_LIBRARIES(MyProj foo1.so)
La modification de la ligne ci-dessus à cela ne fonctionne plus:
TARGET_LINK_LIBRARIES(MyProj foo1.so foo2.so foo3.so)
Juste une autre façon de l'écrire (n'aide pas)
TARGET_LINK_LIBRARIES(MyProj foo1.so)
TARGET_LINK_LIBRARIES(MyProj foo2.so)
TARGET_LINK_LIBRARIES(MyProj foo3.so)
Et comme mentionné ci-dessus: TOUS les 3 bibliothèques sont dans le MÊME répertoire (j'entends avec LINK_DIRECTORIES
)
Et c'est l'erreur que je reçois lorsque vous essayez de compiler avec les autres libs (comme l'a dit que foo1.so
travaux):
[ 50%] Linking CXX executable MyProj
/usr/bin/ld: cannot find -lfoo2
/usr/bin/ld: cannot find -lfoo3
collect2: error: ld returned 1 exit status
make[3]: *** [MyProj] Error 1
make[2]: *** [CMakeFiles/MyProj.dir/all] Error 2
make[1]: *** [CMakeFiles/MyProj.dir/rule] Error 2
make: *** [MyProj] Error 2
P. S.: j'ai fait quelques recherches avant de poster ici, mais ne trouvez pas tout otherone avec cette "étrange" problème. Et pour sûr, je ne serais pas venu si loin avec mon fichier CMake sans quelques recherches sur google compétences ^^
- Probablement,
foo2.so
etfoo3.so
ont un format incorrect pour la plate-forme donnée, tandis quefoo1.so
est bon. Vous pouvez utiliserfile
de commande pour chacun d'entre eux et de comparer la production. - Merci pour ces conseils (ne pensez pas à la
file
de commande...). Mais ils sont les mêmes:foo3.so: ELF 64-bit LSB shared object, x86-64, version 1 (SYSV), dynamically linked, BuildID[sha1]=..., stripped
foo2.so: ELF 64-bit LSB shared object, x86-64, version 1 (SYSV), dynamically linked, BuildID[sha1]=..., stripped
foo1.so: ELF 64-bit LSB shared object, x86-64, version 1 (SYSV), dynamically linked, BuildID[sha1]=..., stripped
Vous devez vous connecter pour publier un commentaire.
Pas sûr, mais il me semble que CMake est à la recherche d'
libfoo1.so
alors que le fichier est en faitfoo1.so
(la même chose s'applique pourfoo2
etfoo3
)Essayer "l'importation" la libs:
MODIFIER
Il y a aussi la possibilité de fournir le chemin d'accès complet à la bibliothèque:
fooX
à consulterlibfooX.so
oulibfooX.a
, ce sont (autant que je sache) les 2 méthodes pour l'établissement de liens entre les libs dans CMake. Personnellement, je préfère la "cible importé", car il est plus souple (par exemple, vous pouvez définir laIMPORTED_LOCATION
propriété pour chaque plate-forme sans changer letarget_link_libraries()
appel). Elle exige également moins de taper si vous avez plusieurs cibles à l'aide de la même lib externe.IMPORTED
manière aidé ici - je ne comprends pas pourquoi...Tout d'abord , vous devez renommer toto1.donc, pour libfool1.donc
Puis l'ajouter à votre CMakeLists.txt
link_directories("/home/sources/lib/libtruc1.si")