【问题标题】:Unable to generate a shared library using cmake无法使用 cmake 生成共享库
【发布时间】:2021-02-24 18:32:58
【问题描述】:

我试图使用 cmake 为我的项目生成一个共享库,不幸的是我收到了这个错误

Undefined symbols for architecture x86_64:
  "_SDL_Init", referenced from:
      _main in main.cpp.o
  "_SDL_Quit", referenced from:
      _main in main.cpp.o
ld: symbol(s) not found for architecture x86_64
clang: error: linker command failed with exit code 1 (use -v to see invocation)

如果我正在构建一个静态库,它就可以工作。这是我的 cmake 文件:

cmake_minimum_required(VERSION 3.4.1)
project(yanthra_console VERSION 0.1 DESCRIPTION "A 3d Game Engine.")
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++17 -fexceptions")
set(CMAKE_EXPORT_COMPILE_COMMANDS ON)

set(CMAKE_CONFIGURATION_TYPES "RelWithDebInfo;Release;Debug" CACHE STRING "Build type selections" FORCE)



set(THIRD_PARTY_DIR "../../third-party")
set(MAIN_SOURCE_DIR "../main/src")
set(CMAKE_RUNTIME_OUTPUT_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}/out)
set(CMAKE_LIBRARY_OUTPUT_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}/lib )

set(CMAKE_ARCHIVE_OUTPUT_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}/lib)

include_directories(${THIRD_PARTY_DIR}/SDL/include)

file(GLOB_RECURSE CPP_HEADERS ${MAIN_SOURCE_DIR}/*.hpp)
file(GLOB_RECURSE CPP_SOURCES ${MAIN_SOURCE_DIR}/*.cpp)


add_library(
   yanthra
   SHARED
   ${CPP_HEADERS}
   ${CPP_SOURCES}
)

add_executable(
    yanthra_console
    ${CPP_HEADERS}
    ${CPP_SOURCES}
)

set_target_properties(
    yanthra_console 
    PROPERTIES
    LINK_FLAGS
    "-F../Frameworks -framework SDL2 -framework OpenGL"
)


target_link_libraries(yanthra_console PRIVATE yanthra)

我能够创建一个带有可执行文件的静态库。我正在使用 Mulit Configuration 来构建项目。

【问题讨论】:

  • 错误消息是来自您尝试构建库时,还是您尝试使用它时?我猜add_executable 部分适合你,但如果你尝试使用add_library 它会失败吗?
  • @super 是的。 add_executable 单独工作以及使用它生成静态库时都可以正常工作。该错误仅在尝试生成共享库时出现。感谢您的回复。
  • 那么您是否将 LINK_FLAGS 添加到您的库目标中?
  • 我确实将它添加到了可执行目标中,但没有添加到库中。我应该使用哪种方法添加它?
  • 你应该使用set_target_properties,就像你使用yanthra_console一样

标签: c++ cmake shared-libraries c++17 sdl


【解决方案1】:

看起来像是符号可见性问题。

默认情况下,clang/gcc 符号是隐藏的。

有一个 cppcon talk 谈到这个: https://www.youtube.com/watch?v=m0DwB4OvDXk&list=PL4s9OdsBXD7aXhgqibbEzf8zAM5eiiENs&index=9

基本上要么这个库不支持构建为共享库。 或者您需要以某种方式启用该功能。

或者只是强制符号可见性。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-11-21
    • 2021-12-26
    • 2016-02-16
    • 1970-01-01
    • 1970-01-01
    • 2017-05-29
    • 2020-04-27
    • 1970-01-01
    相关资源
    最近更新 更多