2012-10-10 3 views
3

Я создал себе Ogre3D http://ogre3d.org двоичные файлы, и теперь я хочу связать с ними свой проект в Qt (я использую CMake в качестве моего инструмента построения). Это мой CMakeLists.txt файл:CMake linking shared library - не могу найти lOgreMain

project(ogre_face_test) 
cmake_minimum_required(VERSION 2.8) 
aux_source_directory(. SRC_LIST) 
add_executable(${PROJECT_NAME} ${SRC_LIST}) 

include_directories("/home/XXX/programming/SDKs/OGRE_1.8.1_BUILD/include" ".") 

link_directories("/home/XXX/programming/SDKs/OGRE_1.8.1_BUILD/lib") 
target_link_libraries(ogre_face_test "OgreMain") 

В .../BUILD/lib каталог У меня есть файлы, такие как: libOgreMain.so, libOgreMain.so.1.8.1 и так далее.

Я получаю эту ошибку связывая в Qt Creator:

/usr/bin/cmake -H/home/XXX/programming/c++/ogre_face_sample/ogre_face_test -B/home/XXX/programming/c++/ogre_face_sample/ogre_face_test-build --check-build-system CMakeFiles/Makefile.cmake 0 
/usr/bin/cmake -E cmake_progress_start /home/XXX/programming/c++/ogre_face_sample/ogre_face_test-build/CMakeFiles /home/XXX/programming/c++/ogre_face_sample/ogre_face_test-build/CMakeFiles/progress.marks 
make -f CMakeFiles/Makefile2 all 
make[1]: Entering directory `/home/XXX/programming/c++/ogre_face_sample/ogre_face_test-build' 
make -f CMakeFiles/ogre_face_test.dir/build.make CMakeFiles/ogre_face_test.dir/depend 
make[2]: Entering directory `/home/XXX/programming/c++/ogre_face_sample/ogre_face_test-build' 
cd /home/XXX/programming/c++/ogre_face_sample/ogre_face_test-build && /usr/bin/cmake -E cmake_depends "Unix Makefiles" /home/XXX/programming/c++/ogre_face_sample/ogre_face_test /home/XXX/programming/c++/ogre_face_sample/ogre_face_test /home/XXX/programming/c++/ogre_face_sample/ogre_face_test-build /home/XXX/programming/c++/ogre_face_sample/ogre_face_test-build /home/XXX/programming/c++/ogre_face_sample/ogre_face_test-build/CMakeFiles/ogre_face_test.dir/DependInfo.cmake --color= 
make[2]: Leaving directory `/home/XXX/programming/c++/ogre_face_sample/ogre_face_test-build' 
make -f CMakeFiles/ogre_face_test.dir/build.make CMakeFiles/ogre_face_test.dir/build 
make[2]: Entering directory `/home/XXX/programming/c++/ogre_face_sample/ogre_face_test-build' 
Linking CXX executable ogre_face_test 
/usr/bin/cmake -E cmake_link_script CMakeFiles/ogre_face_test.dir/link.txt --verbose=1 
/usr/bin/c++  CMakeFiles/ogre_face_test.dir/main.cpp.o CMakeFiles/ogre_face_test.dir/FacialAnimation.cpp.o -o ogre_face_test -rdynamic -lOgreMain 
/usr/bin/ld: cannot find -lOgreMain 
collect2: error: ld returned 1 exit status 
make[2]: *** [ogre_face_test] Error 1 
make[2]: Leaving directory `/home/XXX/programming/c++/ogre_face_sample/ogre_face_test-build' 
make[1]: *** [CMakeFiles/ogre_face_test.dir/all] Error 2 
make[1]: Leaving directory `/home/XXX/programming/c++/ogre_face_sample/ogre_face_test-build' 
make: *** [all] Error 2 

EDIT

С другой стороны, если я использую qmake вместо CMake с этим файлом:

TARGET = qt_test_1 
TEMPLATE = app 

SOURCES += main.cpp\ 
     FacialAnimation.cpp 

HEADERS += FacialAnimation.h 

INCLUDEPATH += /usr/include\ 
      /home/monkey/programming/SDKs/OGRE_1.8.1_BUILD/include 
DEPENDPATH += /usr/include 
LIBS += -L/home/monkey/programming/SDKs/OGRE_1.8.1_BUILD/lib -lOgreMain 

он хорошо связывается.

+1

Вы можете запустить make с аргументом VERBOSE = 1 (make, not cmake, а не qmake), чтобы проверить фактические используемые командной строки? –

+0

@JanHudec Спасибо за подсказку;) Пожалуйста, взгляните на мое обновление. – Patryk

ответ

7

документация CMake говорит:

  • link_directories: Укажите каталоги, в которых компоновщик будет искать библиотеки.

    link_directories(directory1 directory2 ...) 
    

    Укажите пути, по которым компоновщик должен искать библиотеки. Команда будет применяться только к целям, созданным после ее вызова. По историческим причинам относительные пути, переданные этой команде, передаются в компоновщик без изменений (в отличие от многих команд CMake, которые интерпретируют их относительно текущего исходного каталога).

(курсив мой) Таким образом, вы должны установить директории вплоть до вызова add_executable.

+2

@JanHudes Спасибо, много! :) + Я должен добавить, что 'target_link_libraries (...)' должно быть после 'add_executable (...)' - это было не так очевидно для меня, прежде чем я прочитал некоторую библиотеку linux, связывающую учебники. – Patryk