【问题标题】:CMake linking shared library - cannot find lOgreMainCMake链接共享库-找不到lOgreMain
【发布时间】:2012-09-30 18:56:54
【问题描述】:

我已经构建了自己的 Ogre3D http://ogre3d.org 二进制文件,现在我想将我在 Qt 中的项目链接到它们(我使用 CMake 作为我的构建工具)。这是我的CMakeLists.txt 文件:

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.solibOgreMain.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

编辑

另一方面,如果我在此文件中使用 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

链接很好。

【问题讨论】:

  • 您可以使用 VERBOSE=1(make,不是 cmake,而不是 qmake)参数运行 make 来检查实际使用的命令行吗?
  • @JanHudec 感谢您的提示;)请查看我的更新。

标签: gcc linker cmake shared-libraries ogre


【解决方案1】:

CMake 文档说:

  • link_directories:指定链接器将在其中查找库的目录。

    link_directories(directory1 directory2 ...)
    

    指定链接器搜索库的路径。 该命令将仅适用于调用后创建的目标。 由于历史原因,此命令的相对路径会原封不动地传递给链接器(与许多相对于当前源目录解释它们的 CMake 命令不同)。

(强调我的)所以你必须在调用add_executable之前设置目录。

【讨论】:

  • @JanHudes 非常感谢! :) + 我必须补充一点,target_link_libraries(...) 必须在 add_executable(...) 之后——在我阅读一些 linux 库链接教程之前,这对我来说并不那么明显。
猜你喜欢
  • 2015-10-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-07-25
  • 2015-10-08
  • 1970-01-01
  • 2017-05-29
相关资源
最近更新 更多