首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >cmake链接器错误,库安装在自定义路径中

cmake链接器错误,库安装在自定义路径中
EN

Stack Overflow用户
提问于 2020-04-26 03:17:58
回答 1查看 108关注 0票数 0

我已经用CMake将库SDL_bgi编译并安装到自定义前缀/custom/prefix/。这个库使用SDL2。

现在,我想在另一个具有下面结构的项目中使用它,但是当我使用make编译时,我得到了一个链接器错误

代码语言:javascript
复制
/usr/bin/c++     CMakeFiles/test.dir/test.cpp.o  -o test  -Wl,-rpath,/custom/prefix/lib: /custom/prefix/lib/libSDL_bgi.so 

/usr/bin/ld: /custom/prefix/lib/libSDL_bgi.so: undefined reference to `SDL_DestroyWindow'
/usr/bin/ld: /custom/prefix/lib/libSDL_bgi.so: undefined reference to `SDL_CreateRenderer'

我还写了cmake/modules/FindSDL_bgi.cmake文件,所以这也可能是错误的。

如果我使用以下命令编译,我可以正确编译:

代码语言:javascript
复制
g++ test.cpp -I . -lSDL_bgi -lSDL2 -I /custom/prefix/include/ -L /custom/prefix/lib/ 

我做错了什么?

项目结构:

代码语言:javascript
复制
cmake/modules/FindSDL_bgi.cmake
src/test/CMakeLists.txt
src/test/test.cpp
CMakeLists.txt

库:

代码语言:javascript
复制
/usr/lib/libSDL.so
/usr/include/SDL.h
/custom/prefix/lib/libSDL_bgi.so
/custom/prefix/include/graphics.h
/custom/prefix/include/SDL2/libSDL_bgi.h

cmake/modules/FindSDL_bgi.cmake:

代码语言:javascript
复制
# - Try to find LibXml2
# Once done this will define
#  SDL_BGI_FOUND - System has LibXml2
#  SDL_BGI_INCLUDE_DIRS - The LibXml2 include directories
#  SDL_BGI_LIBRARIES - The libraries needed to use LibXml2

# Hardcoded for now
set(SDL_BGI_PATH
    /custom/prefix/
)

set(SDL_BGI_SEARCH_PATHS
    /usr
    /usr/local
    /opt
    ${SDL_BGI_PATH}
)

find_path(SDL_BGI_INCLUDE_DIR graphics.h
    HINTS
    $ENV{SDL2DIR}
    PATH_SUFFIXES include
    PATHS ${SDL2_SEARCH_PATHS}
)

find_library(SDL_BGI_LIBRARY
    NAMES SDL_bgi
    HINTS
    $ENV{SDL2DIR}
    PATH_SUFFIXES lib64 lib
    PATHS ${SDL2_SEARCH_PATHS}
)

include(FindPackageHandleStandardArgs)

find_package_handle_standard_args(SDL_bgi REQUIRED_VARS SDL_BGI_LIBRARY SDL_BGI_INCLUDE_DIR)

CMakeLists.txt

代码语言:javascript
复制
cmake_minimum_required(VERSION 3.15)

project(programmi_kennedy)

list(APPEND CMAKE_MODULE_PATH "${PROJECT_SOURCE_DIR}/cmake/modules")

set(COMPAT_HEADERS
    ${CMAKE_CURRENT_SOURCE_DIR}/include/
)

find_package(SDL_bgi REQUIRED)

add_subdirectory(src/test)

src/CMakeLists.txt:

代码语言:javascript
复制
add_executable(test test.cpp)
target_include_directories(test PUBLIC ${SDL_BGI_INCLUDE_DIR})
target_link_libraries(test PRIVATE ${SDL_BGI_LIBRARY})
install(TARGETS test DESTINATION bin)

/custom/prefix/include/raphics.h:

代码语言:javascript
复制
#include <SDL2/SDL_bgi.h>
EN

回答 1

Stack Overflow用户

发布于 2020-04-26 03:41:38

我缺少的是用find_package(SDL2 REQUIRED)链接到SDL2和链接到SDL2::SDL2。(我确实尝试过链接到${SDL2_LIBRARIES},但现在语法不同了)。感谢@KamilCuk为我指明了正确的方向。

编辑:

我更改了FindBGI_sdl.cmake模块,以便搜索依赖项(SDL2)并使用INTERFACE关键字链接它们。这样,目标test只能针对SDL_bgi进行链接,并自动解析依赖关系。

src/CMakeLists.txt:

代码语言:javascript
复制
add_executable(test test.cpp)
target_link_libraries(test PRIVATE SDL_bgi::SDL_bgi)
install(TARGETS test DESTINATION bin)

cmake/modules/FindSDL_bgi.cmake:

代码语言:javascript
复制
# Distributed under the OSI-approved BSD 3-Clause License.  See accompanying
# file Copyright.txt or https://cmake.org/licensing for details.

#[=======================================================================[.rst:
FindSDL_bgi
-------

Finds the SDL_bgi library.

Imported Targets
^^^^^^^^^^^^^^^^

This module provides the following imported targets, if found:

``SDL_bgi::SDL_bgi``
  The SDL_bgi library

Result Variables
^^^^^^^^^^^^^^^^

This will define the following variables:

``SDL_bgi_FOUND``
  True if the system has the SDL_bgi library.
``SDL_bgi_VERSION``
  The version of the SDL_bgi library which was found.
``SDL_bgi_INCLUDE_DIRS``
  Include directories needed to use SDL_bgi.
``SDL_bgi_LIBRARIES``
  Libraries needed to link to SDL_bgi.

Cache Variables
^^^^^^^^^^^^^^^

The following cache variables may also be set:

``SDL_bgi_INCLUDE_DIR``
  The directory containing ``foo.h``.
``SDL_bgi_LIBRARY``
  The path to the SDL_bgi library.

#]=======================================================================]

find_package(SDL2 REQUIRED)
find_package(PkgConfig)
pkg_check_modules(PC_SDL_bgi QUIET SDL_bgi)

find_path(SDL_bgi_INCLUDE_DIR
    NAMES graphics.h
    PATHS ${PC_SDL_bgi_INCLUDE_DIRS}
)

find_library(SDL_bgi_LIBRARY
    NAMES SDL_bgi
    PATHS ${PC_SDL_bgi_LIBRARY_DIRS}
)

set(SDL_bgi_VERSION ${PC_SDL_bgi_VERSION})

include(FindPackageHandleStandardArgs)
find_package_handle_standard_args(SDL_bgi
  FOUND_VAR SDL_bgi_FOUND
  REQUIRED_VARS
    SDL_bgi_LIBRARY
    SDL_bgi_INCLUDE_DIR
  VERSION_VAR SDL_bgi_VERSION
)

if(SDL_bgi_FOUND AND NOT TARGET SDL_bgi::SDL_bgi)
  add_library(SDL_bgi::SDL_bgi UNKNOWN IMPORTED)
  set_target_properties(SDL_bgi::SDL_bgi PROPERTIES
    IMPORTED_LOCATION "${SDL_bgi_LIBRARY}"
    INTERFACE_COMPILE_OPTIONS "${PC_SDL_bgi_CFLAGS_OTHER}"
    INTERFACE_INCLUDE_DIRECTORIES "${SDL_bgi_INCLUDE_DIR}"
  )
  target_link_libraries(SDL_bgi::SDL_bgi INTERFACE SDL2::SDL2)
endif()

mark_as_advanced(
  SDL_bgi_INCLUDE_DIR
  SDL_bgi_LIBRARY
  SDL2_DIR
)

有用的参考资料:

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/61431233

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档