#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
В принципе, либо эта библиотека не поддерживает создание в качестве разделяемой библиотеки. Или вам нужно как-то включить эту функциональность.
Или просто принудительно включить видимость символа.