Невозможно создать общую библиотеку с помощью cmake

#c #cmake #shared-libraries #c 17 #sdl

#c #cmake #общие библиотеки #c 17 #sdl

Вопрос:

Я пытался создать общую библиотеку для своего проекта с помощью 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 для сборки проекта.

Комментарии:

1. Появляется ли сообщение об ошибке при попытке создать свою библиотеку или при попытке ее использовать? Я предполагаю, что эта add_executable часть работает для вас, но если вы попытаетесь использовать add_library ее, это не удастся?

2. @super да, точно. add_executable Отлично работает как в одиночку, так и при использовании его для создания статической библиотеки. Ошибка появляется только при попытке создать общую библиотеку. Спасибо за ответ.

3. Итак, вы добавили LINK_FLAGS в свою целевую библиотеку?

4. Я добавил ее в исполняемый целевой файл, но не для библиотеки. Какой метод я должен использовать для ее добавления?

5. Вы должны использовать set_target_properties так же, как вы делали для yanthra_console

Ответ №1:

Похоже, проблема с видимостью символов.

По умолчанию символы clang / gcc скрыты.

Существует обсуждение cppcon, в котором говорится об этом: https://www.youtube.com/watch?v=m0DwB4OvDXkamp;list=PL4s9OdsBXD7aXhgqibbEzf8zAM5eiiENsamp;index=9

В принципе, либо эта библиотека не поддерживает создание в качестве разделяемой библиотеки. Или вам нужно как-то включить эту функциональность.

Или просто принудительно включить видимость символа.