Anonymous
CMake — невозможно правильно связать спуск на спуске на MacOS
Сообщение
Anonymous » 31 май 2024, 23:16
Я собрал и установил abseil из исходного кода следующим образом:
Код: Выделить всё
cd ./abseil-cpp
git checkout 5dd240724366295970c613ed23d0092bcf392f18
mkdir build
cd ./build
cmake -DCMAKE_CXX_STANDARD=17 ..
make -j 4
sudo make install
Это мой CMakeLists.txt:
Код: Выделить всё
cmake_minimum_required(VERSION 3.22)
project(MyProject)
set(CMAKE_CXX_STANDARD 20)
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -fPIC")
set(OpenGL_GL_PREFERENCE LEGACY)
option(WITH_PROTOBUF PROTOBUF_DIR)
if(WITH_PROTOBUF)
set(PROTOBUF_INCLUDE_DIR ${WITH_PROTOBUF}/include)
set(PROTOBUF_LIB_DIR ${WITH_PROTOBUF}/lib)
endif()
find_package(OpenGL REQUIRED)
find_package(SDL2 REQUIRED)
find_package(Protobuf REQUIRED)
find_package(gRPC REQUIRED)
find_package(absl REQUIRED)
if(APPLE)
set(OPENSSL_ROOT_DIR "/opt/homebrew/opt/openssl@3.0")
set(OPENSSL_INCLUDE_DIR "/opt/homebrew/opt/openssl@3.0/include")
set(OPENSSL_LIBRARIES "/opt/homebrew/opt/openssl@3.0/lib")
endif ()
find_package (OpenSSL REQUIRED)
# set macro-directory
list(APPEND CMAKE_MODULE_PATH ${CMAKE_CURRENT_SOURCE_DIR}/cmake/macros)
if(absl_FOUND)
message(STATUS "Abseil found:")
if(absl::base_FOUND)
message(STATUS " - absl::base found")
endif()
if(absl::synchronization_FOUND)
message(STATUS " - absl::synchronization found")
endif()
if(absl::strings_FOUND)
message(STATUS " - absl::strings found")
endif()
if(absl::memory_FOUND)
message(STATUS " - absl::memory found")
endif()
if(absl::time_FOUND)
message(STATUS " - absl::time found")
endif()
else()
message(FATAL_ERROR "Abseil not found!")
endif()
file(GLOB_RECURSE Source_Files
${CMAKE_CURRENT_SOURCE_DIR}/Configuration/*.cpp
${CMAKE_CURRENT_SOURCE_DIR}/Crypto/*.cpp
${CMAKE_CURRENT_SOURCE_DIR}/Database/*.cpp
${CMAKE_CURRENT_SOURCE_DIR}/DataSchemas/*.cpp
${CMAKE_CURRENT_SOURCE_DIR}/Dynamic/*.cpp
${CMAKE_CURRENT_SOURCE_DIR}/Engine/*.cpp
${CMAKE_CURRENT_SOURCE_DIR}/Engine/Component/*.h
${CMAKE_CURRENT_SOURCE_DIR}/Engine/Component/*.cpp
${CMAKE_CURRENT_SOURCE_DIR}/Engine/Profiler/*.h
${CMAKE_CURRENT_SOURCE_DIR}/Engine/Profiler/*.cpp
${CMAKE_CURRENT_SOURCE_DIR}/Engine/Signal/*.cpp
${CMAKE_CURRENT_SOURCE_DIR}/Http/*.cpp
${CMAKE_CURRENT_SOURCE_DIR}/Memory/*.cpp
${CMAKE_CURRENT_SOURCE_DIR}/Logging/*.cpp
${CMAKE_CURRENT_SOURCE_DIR}/Logging/*.cxx
${CMAKE_CURRENT_SOURCE_DIR}/Networking/*.cpp
${CMAKE_CURRENT_SOURCE_DIR}/Server/*.cpp
${CMAKE_CURRENT_SOURCE_DIR}/Threading/*.cpp
${CMAKE_CURRENT_SOURCE_DIR}/Utils/*.cpp
)
add_library(Vibranium-Engine SHARED ${Source_Files})
target_include_directories(Vibranium-Engine PUBLIC
${CMAKE_CURRENT_SOURCE_DIR}/
${CMAKE_CURRENT_SOURCE_DIR}/dep/stb
${CMAKE_CURRENT_SOURCE_DIR}/dep/rapidjson/include
${PROTOBUF_INCLUDE_DIR}
${OPENSSL_INCLUDE_DIR}
${SDL2_INCLUDE_DIRS}
${MYSQL_INCLUDE_DIR}
${absl_INCLUDE_DIRS}
)
if(APPLE)
include_directories(/opt/homebrew/include)
include_directories(/usr/local/include)
target_link_options(Vibranium-Engine PRIVATE -Wl,-ld_classic)
endif()
target_link_libraries(Vibranium-Engine PUBLIC
boost
curl
fmt
ImGui
ImGuizmo
mysql
utf8cpp
tabulate::tabulate
gtest_main
sentry::sentry
b_stacktrace::b_stacktrace
xmem
${SDL2_LIBRARIES}
${OPENGL_LIBRARIES}
DebugUtils
Detour
DetourCrowd
DetourTileCache
Recast
OpenSSL::SSL
OpenSSL::Crypto
${Protobuf_LIBRARIES}
${MYSQL_LIBRARIES}
absl::base
absl::synchronization
absl::strings
absl::memory
absl::time
gRPC::grpc++
gRPC::grpc++_reflection
)
add_subdirectory(${CMAKE_CURRENT_SOURCE_DIR}/dep)
add_subdirectory(${CMAKE_CURRENT_SOURCE_DIR}/Tests)
add_subdirectory(${CMAKE_CURRENT_SOURCE_DIR}/Vibranium)
if (NOT EXISTS ${CMAKE_BINARY_DIR}/bin/Engine/Resources)
message(STATUS "New ${AppName} Engine Resources folder will be created in: ${CMAKE_BINARY_DIR}/bin/Engine/Resources/")
file(COPY ${CMAKE_CURRENT_SOURCE_DIR}/Engine/Resources DESTINATION ${CMAKE_BINARY_DIR}/bin/Engine)
else()
file(GLOB Resources ${CMAKE_CURRENT_SOURCE_DIR}/Engine/Resources/*)
file(COPY ${Resources} DESTINATION ${CMAKE_BINARY_DIR}/bin/Engine/Resources)
endif()
if(APPLE)
if (NOT EXISTS ${CMAKE_BINARY_DIR}/bin/lib/SDL2.framework)
file(COPY ${CMAKE_CURRENT_SOURCE_DIR}/dep/SDL2/ DESTINATION ${CMAKE_BINARY_DIR}/bin/lib)
else()
file(GLOB SDL2_LIBRARY_FILES ${CMAKE_CURRENT_SOURCE_DIR}/dep/SDL2/*)
file(COPY ${SDL2_LIBRARY_FILES} DESTINATION ${CMAKE_BINARY_DIR}/bin/lib/)
endif()
endif()
set_target_properties(
Vibranium-Engine
PROPERTIES
ARCHIVE_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/bin/lib
LIBRARY_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/bin/lib
)
install(TARGETS Vibranium-Engine LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR})
set_target_properties(RecastDemo PROPERTIES EXCLUDE_FROM_ALL TRUE)
При сборке 100 на этапе связывания я получаю следующую ошибку:
Код: Выделить всё
ld: warning: ignoring duplicate libraries: '/usr/local/lib/libprotobuf.a'
ld: Undefined symbols:
absl::lts_20211102::CHexEscape(absl::lts_20211102::string_view), referenced from:
void absl::lts_20211102::functional_internal::InvokeObject(absl::lts_20211102::functional_internal::VoidPtr, absl::lts_20211102::functional_internal::ForwardT::type, absl::lts_20211102::functional_internal::ForwardT::type) in libgpr.a[42](status_helper.cc.o)
void absl::lts_20211102::functional_internal::InvokeObject(absl::lts_20211102::functional_internal::VoidPtr, absl::lts_20211102::functional_internal::ForwardT::type, absl::lts_20211102::functional_internal::ForwardT::type) in libgpr.a[42](status_helper.cc.o)
void absl::lts_20211102::functional_internal::InvokeObject(absl::lts_20211102::functional_internal::VoidPtr, absl::lts_20211102::functional_internal::ForwardT::type, absl::lts_20211102::functional_internal::ForwardT::type) in libgpr.a[42](status_helper.cc.o)
absl::lts_20211102::FormatTime(absl::lts_20211102::string_view, absl::lts_20211102::Time, absl::lts_20211102::TimeZone), referenced from:
grpc_core::AwsRequestSigner::AwsRequestSigner(std::__1::basic_string, std::__1::basic_string, std::__1::basic_string, std::__1::basic_string, std::__1::basic_string, std::__1::basic_string, std::__1::basic_string, std::__1::map, grpc_error**) in libgrpc.a[551](aws_request_signer.cc.o)
grpc_core::AwsRequestSigner::GetSignedRequestHeaders() in libgrpc.a[551](aws_request_signer.cc.o)
absl::lts_20211102::FormatTime(absl::lts_20211102::Time), referenced from:
grpc_service_account_jwt_access_credentials::debug_string() in libgrpc.a[561](jwt_credentials.cc.o)
void absl::lts_20211102::functional_internal::InvokeObject(absl::lts_20211102::functional_internal::VoidPtr, absl::lts_20211102::functional_internal::ForwardT::type, absl::lts_20211102::functional_internal::ForwardT::type) in libgpr.a[42](status_helper.cc.o)
absl::lts_20211102::ToTimespec(absl::lts_20211102::Time), referenced from:
grpc_core::ToGprTimeSpec(absl::lts_20211102::Time) in libgpr.a[45](time_util.cc.o)
absl::lts_20211102::Base64Escape(absl::lts_20211102::string_view), referenced from:
grpc_core::channelz::SocketNode::Security::Tls::RenderJson() in libgrpc.a[404](channelz.cc.o)
grpc_core::channelz::SocketNode::Security::Tls::RenderJson() in libgrpc.a[404](channelz.cc.o)
grpc_core::channelz::(anonymous namespace)::PopulateSocketAddressJson(std::__1::map*, char const*, char const*) in libgrpc.a[404](channelz.cc.o)
absl::lts_20211102::Notification::Notify(), referenced from:
grpc_core::Server::ShutdownUnrefOnRequest() in libgrpc.a[618](server.cc.o)
absl::lts_20211102::Notification::~Notification(), referenced from:
grpc_core::Server::~Server() in libgrpc.a[618](server.cc.o)
grpc_core::Server::ShutdownAndNotify(grpc_completion_queue*, void*) in libgrpc.a[618](server.cc.o)
absl::lts_20211102::RFC3339_full, referenced from:
grpc_core::ExternalAccountCredentials::OnImpersenateServiceAccountInternal(grpc_error*) in libgrpc.a[552](external_account_credentials.cc.o)
absl::lts_20211102::UnknownError(absl::lts_20211102::string_view), referenced from:
grpc_core::(anonymous namespace)::GoogleCloud2ProdResolver::ZoneQuery::OnDone(grpc_core::(anonymous namespace)::GoogleCloud2ProdResolver*, grpc_http_response const*, grpc_error*) in libgrpc.a[49](google_c2p_resolver.cc.o)
grpc_core::(anonymous namespace)::GoogleCloud2ProdResolver::ZoneQuery::OnDone(grpc_core::(anonymous namespace)::GoogleCloud2ProdResolver*, grpc_http_response const*, grpc_error*) in libgrpc.a[49](google_c2p_resolver.cc.o)
grpc_core::(anonymous namespace)::GoogleCloud2ProdResolver::ZoneQuery::OnDone(grpc_core::(anonymous namespace)::GoogleCloud2ProdResolver*, grpc_http_response const*, grpc_error*) in libgrpc.a[49](google_c2p_resolver.cc.o)
Есть идеи, почему и как я могу это исправить, чтобы снова правильно ссылаться на спуске?
Подробнее здесь:
https://stackoverflow.com/questions/785 ... l-on-macos
1717186602
Anonymous
Я собрал и установил abseil из исходного кода следующим образом: [code]cd ./abseil-cpp git checkout 5dd240724366295970c613ed23d0092bcf392f18 mkdir build cd ./build cmake -DCMAKE_CXX_STANDARD=17 .. make -j 4 sudo make install [/code] Это мой CMakeLists.txt: [code]cmake_minimum_required(VERSION 3.22) project(MyProject) set(CMAKE_CXX_STANDARD 20) set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -fPIC") set(OpenGL_GL_PREFERENCE LEGACY) option(WITH_PROTOBUF PROTOBUF_DIR) if(WITH_PROTOBUF) set(PROTOBUF_INCLUDE_DIR ${WITH_PROTOBUF}/include) set(PROTOBUF_LIB_DIR ${WITH_PROTOBUF}/lib) endif() find_package(OpenGL REQUIRED) find_package(SDL2 REQUIRED) find_package(Protobuf REQUIRED) find_package(gRPC REQUIRED) find_package(absl REQUIRED) if(APPLE) set(OPENSSL_ROOT_DIR "/opt/homebrew/opt/openssl@3.0") set(OPENSSL_INCLUDE_DIR "/opt/homebrew/opt/openssl@3.0/include") set(OPENSSL_LIBRARIES "/opt/homebrew/opt/openssl@3.0/lib") endif () find_package (OpenSSL REQUIRED) # set macro-directory list(APPEND CMAKE_MODULE_PATH ${CMAKE_CURRENT_SOURCE_DIR}/cmake/macros) if(absl_FOUND) message(STATUS "Abseil found:") if(absl::base_FOUND) message(STATUS " - absl::base found") endif() if(absl::synchronization_FOUND) message(STATUS " - absl::synchronization found") endif() if(absl::strings_FOUND) message(STATUS " - absl::strings found") endif() if(absl::memory_FOUND) message(STATUS " - absl::memory found") endif() if(absl::time_FOUND) message(STATUS " - absl::time found") endif() else() message(FATAL_ERROR "Abseil not found!") endif() file(GLOB_RECURSE Source_Files ${CMAKE_CURRENT_SOURCE_DIR}/Configuration/*.cpp ${CMAKE_CURRENT_SOURCE_DIR}/Crypto/*.cpp ${CMAKE_CURRENT_SOURCE_DIR}/Database/*.cpp ${CMAKE_CURRENT_SOURCE_DIR}/DataSchemas/*.cpp ${CMAKE_CURRENT_SOURCE_DIR}/Dynamic/*.cpp ${CMAKE_CURRENT_SOURCE_DIR}/Engine/*.cpp ${CMAKE_CURRENT_SOURCE_DIR}/Engine/Component/*.h ${CMAKE_CURRENT_SOURCE_DIR}/Engine/Component/*.cpp ${CMAKE_CURRENT_SOURCE_DIR}/Engine/Profiler/*.h ${CMAKE_CURRENT_SOURCE_DIR}/Engine/Profiler/*.cpp ${CMAKE_CURRENT_SOURCE_DIR}/Engine/Signal/*.cpp ${CMAKE_CURRENT_SOURCE_DIR}/Http/*.cpp ${CMAKE_CURRENT_SOURCE_DIR}/Memory/*.cpp ${CMAKE_CURRENT_SOURCE_DIR}/Logging/*.cpp ${CMAKE_CURRENT_SOURCE_DIR}/Logging/*.cxx ${CMAKE_CURRENT_SOURCE_DIR}/Networking/*.cpp ${CMAKE_CURRENT_SOURCE_DIR}/Server/*.cpp ${CMAKE_CURRENT_SOURCE_DIR}/Threading/*.cpp ${CMAKE_CURRENT_SOURCE_DIR}/Utils/*.cpp ) add_library(Vibranium-Engine SHARED ${Source_Files}) target_include_directories(Vibranium-Engine PUBLIC ${CMAKE_CURRENT_SOURCE_DIR}/ ${CMAKE_CURRENT_SOURCE_DIR}/dep/stb ${CMAKE_CURRENT_SOURCE_DIR}/dep/rapidjson/include ${PROTOBUF_INCLUDE_DIR} ${OPENSSL_INCLUDE_DIR} ${SDL2_INCLUDE_DIRS} ${MYSQL_INCLUDE_DIR} ${absl_INCLUDE_DIRS} ) if(APPLE) include_directories(/opt/homebrew/include) include_directories(/usr/local/include) target_link_options(Vibranium-Engine PRIVATE -Wl,-ld_classic) endif() target_link_libraries(Vibranium-Engine PUBLIC boost curl fmt ImGui ImGuizmo mysql utf8cpp tabulate::tabulate gtest_main sentry::sentry b_stacktrace::b_stacktrace xmem ${SDL2_LIBRARIES} ${OPENGL_LIBRARIES} DebugUtils Detour DetourCrowd DetourTileCache Recast OpenSSL::SSL OpenSSL::Crypto ${Protobuf_LIBRARIES} ${MYSQL_LIBRARIES} absl::base absl::synchronization absl::strings absl::memory absl::time gRPC::grpc++ gRPC::grpc++_reflection ) add_subdirectory(${CMAKE_CURRENT_SOURCE_DIR}/dep) add_subdirectory(${CMAKE_CURRENT_SOURCE_DIR}/Tests) add_subdirectory(${CMAKE_CURRENT_SOURCE_DIR}/Vibranium) if (NOT EXISTS ${CMAKE_BINARY_DIR}/bin/Engine/Resources) message(STATUS "New ${AppName} Engine Resources folder will be created in: ${CMAKE_BINARY_DIR}/bin/Engine/Resources/") file(COPY ${CMAKE_CURRENT_SOURCE_DIR}/Engine/Resources DESTINATION ${CMAKE_BINARY_DIR}/bin/Engine) else() file(GLOB Resources ${CMAKE_CURRENT_SOURCE_DIR}/Engine/Resources/*) file(COPY ${Resources} DESTINATION ${CMAKE_BINARY_DIR}/bin/Engine/Resources) endif() if(APPLE) if (NOT EXISTS ${CMAKE_BINARY_DIR}/bin/lib/SDL2.framework) file(COPY ${CMAKE_CURRENT_SOURCE_DIR}/dep/SDL2/ DESTINATION ${CMAKE_BINARY_DIR}/bin/lib) else() file(GLOB SDL2_LIBRARY_FILES ${CMAKE_CURRENT_SOURCE_DIR}/dep/SDL2/*) file(COPY ${SDL2_LIBRARY_FILES} DESTINATION ${CMAKE_BINARY_DIR}/bin/lib/) endif() endif() set_target_properties( Vibranium-Engine PROPERTIES ARCHIVE_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/bin/lib LIBRARY_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/bin/lib ) install(TARGETS Vibranium-Engine LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR}) set_target_properties(RecastDemo PROPERTIES EXCLUDE_FROM_ALL TRUE) [/code] При сборке 100 на этапе связывания я получаю следующую ошибку: [code]ld: warning: ignoring duplicate libraries: '/usr/local/lib/libprotobuf.a' ld: Undefined symbols: absl::lts_20211102::CHexEscape(absl::lts_20211102::string_view), referenced from: void absl::lts_20211102::functional_internal::InvokeObject(absl::lts_20211102::functional_internal::VoidPtr, absl::lts_20211102::functional_internal::ForwardT::type, absl::lts_20211102::functional_internal::ForwardT::type) in libgpr.a[42](status_helper.cc.o) void absl::lts_20211102::functional_internal::InvokeObject(absl::lts_20211102::functional_internal::VoidPtr, absl::lts_20211102::functional_internal::ForwardT::type, absl::lts_20211102::functional_internal::ForwardT::type) in libgpr.a[42](status_helper.cc.o) void absl::lts_20211102::functional_internal::InvokeObject(absl::lts_20211102::functional_internal::VoidPtr, absl::lts_20211102::functional_internal::ForwardT::type, absl::lts_20211102::functional_internal::ForwardT::type) in libgpr.a[42](status_helper.cc.o) absl::lts_20211102::FormatTime(absl::lts_20211102::string_view, absl::lts_20211102::Time, absl::lts_20211102::TimeZone), referenced from: grpc_core::AwsRequestSigner::AwsRequestSigner(std::__1::basic_string, std::__1::basic_string, std::__1::basic_string, std::__1::basic_string, std::__1::basic_string, std::__1::basic_string, std::__1::basic_string, std::__1::map, grpc_error**) in libgrpc.a[551](aws_request_signer.cc.o) grpc_core::AwsRequestSigner::GetSignedRequestHeaders() in libgrpc.a[551](aws_request_signer.cc.o) absl::lts_20211102::FormatTime(absl::lts_20211102::Time), referenced from: grpc_service_account_jwt_access_credentials::debug_string() in libgrpc.a[561](jwt_credentials.cc.o) void absl::lts_20211102::functional_internal::InvokeObject(absl::lts_20211102::functional_internal::VoidPtr, absl::lts_20211102::functional_internal::ForwardT::type, absl::lts_20211102::functional_internal::ForwardT::type) in libgpr.a[42](status_helper.cc.o) absl::lts_20211102::ToTimespec(absl::lts_20211102::Time), referenced from: grpc_core::ToGprTimeSpec(absl::lts_20211102::Time) in libgpr.a[45](time_util.cc.o) absl::lts_20211102::Base64Escape(absl::lts_20211102::string_view), referenced from: grpc_core::channelz::SocketNode::Security::Tls::RenderJson() in libgrpc.a[404](channelz.cc.o) grpc_core::channelz::SocketNode::Security::Tls::RenderJson() in libgrpc.a[404](channelz.cc.o) grpc_core::channelz::(anonymous namespace)::PopulateSocketAddressJson(std::__1::map*, char const*, char const*) in libgrpc.a[404](channelz.cc.o) absl::lts_20211102::Notification::Notify(), referenced from: grpc_core::Server::ShutdownUnrefOnRequest() in libgrpc.a[618](server.cc.o) absl::lts_20211102::Notification::~Notification(), referenced from: grpc_core::Server::~Server() in libgrpc.a[618](server.cc.o) grpc_core::Server::ShutdownAndNotify(grpc_completion_queue*, void*) in libgrpc.a[618](server.cc.o) absl::lts_20211102::RFC3339_full, referenced from: grpc_core::ExternalAccountCredentials::OnImpersenateServiceAccountInternal(grpc_error*) in libgrpc.a[552](external_account_credentials.cc.o) absl::lts_20211102::UnknownError(absl::lts_20211102::string_view), referenced from: grpc_core::(anonymous namespace)::GoogleCloud2ProdResolver::ZoneQuery::OnDone(grpc_core::(anonymous namespace)::GoogleCloud2ProdResolver*, grpc_http_response const*, grpc_error*) in libgrpc.a[49](google_c2p_resolver.cc.o) grpc_core::(anonymous namespace)::GoogleCloud2ProdResolver::ZoneQuery::OnDone(grpc_core::(anonymous namespace)::GoogleCloud2ProdResolver*, grpc_http_response const*, grpc_error*) in libgrpc.a[49](google_c2p_resolver.cc.o) grpc_core::(anonymous namespace)::GoogleCloud2ProdResolver::ZoneQuery::OnDone(grpc_core::(anonymous namespace)::GoogleCloud2ProdResolver*, grpc_http_response const*, grpc_error*) in libgrpc.a[49](google_c2p_resolver.cc.o) [/code] Есть идеи, почему и как я могу это исправить, чтобы снова правильно ссылаться на спуске? Подробнее здесь: [url]https://stackoverflow.com/questions/78561980/cmake-unable-to-link-properly-against-abseil-on-macos[/url]