簡體   English   中英

如何使用 CMake 在我的項目中正確鏈接我的庫?

[英]How do I properly link my libraries in my project using CMake?

我目前正在學習 CMake,我正在嘗試創建我的第一個測試項目。 我可以通過 CMake 在 visual studio 中啟動並運行一個簡單的項目。但是,我在嘗試添加庫時遇到了問題。 我已經閱讀了一些指南和內容,但我不斷收到錯誤。 基本上,我試圖在我的示例項目中鏈接 SDL 庫(一個游戲編程庫)。 我已將這些庫放在頂層“第三方”文件夾中。 這是我的 CmakeLists.txt 文件在我的頂級目錄中的樣子:

cmake_minimum_required(VERSION 2.8.11)

project(Hello)

#Find necessary header files
find_path(SDL_INCLUDE_DIR SDL.h HINTS ${CMAKE_SOURCE_DIR}/ThirdParty/SDL2/include/)

#Find necessary library files
find_library(SDL_LIB_DIR SDL2 HINTS ${CMAKE_SOURCE_DIR}/ThirdParty/SDL2/lib/x86)
find_library(SDLMAIN_LIB_DIR SDLmain HINTS ${CMAKE_SOURCE_DIR}/ThirdParty/SDL2/lib/x86)

#Add/Link files to project
include_directories(${SDL_INCLUDE_DIR})
target_link_libraries(Test PUBLIC ${SDL_LIB_DIR})
target_link_libraries(Test PUBLIC ${SDLMAIN_LIB_DIR})



add_executable(Test "${CMAKE_SOURCE_DIR}/Source/Main.cpp")

我不是 100% 確定 HINTS 參數,但我看到它在另一個線程上使用。 無論如何,這是我不斷收到的錯誤:

CMake Error: The following variables are used in this project, but they are set to NOTFOUND.
Please set them or make sure they are set and tested correctly in the CMake files:
SDLMAIN_LIB_DIR
    linked by target "Test" in directory C:/Users/Jason/Desktop/Test

我做錯了什么以及如何正確鏈接 CMake 中的庫?

  1. 在cmake中,首先創建可執行文件, 然后將其鏈接到庫
  2. 您必須了解在CMake中如何查找庫和軟件包。 通常,它的工作方式是使用find_libraryfind_package ,然后cmake將設置一些可用於鏈接到/使用庫的變量。

我對SDL不熟悉,但是通過仔細研究一下它,我會說這是應該的樣子:

find_file(SDL2_INCLUDE_DIR NAME SDL.h HINTS SDL2)
find_library(SDL2_LIBRARY NAME SDL2)
add_executable(MyExec main.cpp)
target_include_directories(MyExec ${SDL2_INCLUDE_DIR})
target_link_libraries(MyExec ${SDL2_LIBRARY})

find_library將設置變量SDL2_INCLUDE_DIRSDL2_LIBRARY ,您可以使用它們來鏈接到SDL並將其包含項添加到您的項目中。

我也在嘗試這樣做,但是當我嘗試使用我的書店時,它無法識別它。

catkin_package(
  INCLUDE_DIRS include ${EXTERNAL_INCLUDE_DIRS}
  LIBRARIES ${PROJECT_NAME}
  CATKIN_DEPENDS message_runtime roscpp actionlib
  DEPENDS
)

## Setup include dirs
include_directories(include ${catkin_INCLUDE_DIRS} ${Boost_INCLUDE_DIRS})
include_directories(SYSTEM ${EIGEN3_INCLUDE_DIRS})

include_directories(
  SYSTEM
  ${EXTERNAL_INCLUDE_DIRS}
  ${catkin_INCLUDE_DIRS}
)

# Trajectory planners

add_library(${PROJECT_NAME}_planners
  src/PRM_planner.cpp
 )

target_link_libraries(${PROJECT_NAME}_planners
  ${catkin_LIBRARIES}
  ${RL_LIBRARIES}
)


add_executable(trajectory_planner src/trajectory_planner.cpp)
target_link_libraries(trajectory_planner
  ${PROJECT_NAME}_planners
  ${catkin_LIBRARIES}
  ${RL_LIBRARIES}
)

在我的文件 track_planner.cpp 中:

#include "trajectory/prm_planner.h"


int main()
{
    prm_planner::plan();
    return 0;
}

但我有這個錯誤:

CMakeFiles/trajectory_planner.dir/src/trajectory_planner.cpp.o: In function `main':
trajectory_planner.cpp:(.text+0x5): undefined reference to `prm_planner::plan()'
collect2: error: ld returned 1 exit status
toolbox_ur3/CMakeFiles/trajectory_planner.dir/build.make:391: recipe for target '/home/euroage/catkin_ws/devel/lib/toolbox_ur3/trajectory_planner' failed
make[2]: *** [/home/euroage/catkin_ws/devel/lib/toolbox_ur3/trajectory_planner] Error 1
CMakeFiles/Makefile2:15231: recipe for target 'toolbox_ur3/CMakeFiles/trajectory_planner.dir/all' failed
make[1]: *** [toolbox_ur3/CMakeFiles/trajectory_planner.dir/all] Error 2
Makefile:140: recipe for target 'all' failed
make: *** [all] Error 2

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM