0

I have c++ lib made by my colleagues which is compiled perfectly on Linux. I need make it on Mac. Plain cmake && make works fine on Mac, but I need to make it with shared libs

cmake -DCMAKE_BUILD_TYPE=Release -DBUILD_SHARED_LIBS=ON ..
cmake --build .

And during build I get errors:

[ 83%] Linking CXX shared library libacvp-core.dylib
Undefined symbols for architecture x86_64:
  "_OPENSSL_init_ssl", referenced from:
 …
  "log4cplus::Logger::~Logger()", referenced from: …
  "_nghttp2_select_next_protocol", referenced from: …

I've installed openssl (by brew) and some required libs (log4cplus, nghttp2) from sources. I see them in /usr/local/lib. Also I've set some env variables.

% echo $LD_LIBRARY_PATH
/usr/local/lib:/usr/local/include
% echo $LIBRARY_PATH 
/usr/local/lib
% echo $LDFLAGS
-L/usr/local/opt/openssl@3/lib -L/usr/local/opt/util-linux/lib -L/usr/local/lib

But it doesn't help. Maybe I need modify CMakeLists somehow additionally for Mac?

UPD: CMakeLists.txt


SET(TARGET myproject-cpp)
PROJECT(${TARGET})

option(MYPROJECT_CPP_BUILD_TESTS "Build MYPROJECT-CPP tests" OFF)

EXECUTE_PROCESS(COMMAND
  bash "-c" "git tag -l --contains HEAD | tail -1"
  WORKING_DIRECTORY "${CMAKE_SOURCE_DIR}"
  OUTPUT_VARIABLE GIT_COMMIT_TAG
  ERROR_QUIET OUTPUT_STRIP_TRAILING_WHITESPACE)

IF (DEFINED $ENV{CI_GIT_COMMIT_TAG})
    SET(GIT_COMMIT_TAG $ENV{CI_GIT_COMMIT_TAG})
ENDIF (DEFINED $ENV{CI_GIT_COMMIT_TAG})

message("GIT_COMMIT_TAG=${GIT_COMMIT_TAG}")
message("CI_GIT_COMMIT_TAG=$ENV{CI_GIT_COMMIT_TAG}")

EXECUTE_PROCESS(COMMAND
  git rev-parse --short HEAD
  WORKING_DIRECTORY "${CMAKE_SOURCE_DIR}"
  OUTPUT_VARIABLE GIT_COMMIT_SHA
  ERROR_QUIET OUTPUT_STRIP_TRAILING_WHITESPACE)

IF (DEFINED $ENV{CI_GIT_COMMIT_SHA})
    SET(GIT_COMMIT_SHA $ENV{CI_GIT_COMMIT_SHA})
ENDIF (DEFINED $ENV{CI_GIT_COMMIT_SHA})

message("GIT_COMMIT_SHA=${GIT_COMMIT_SHA}")
message("CI_GIT_COMMIT_SHA=$ENV{CI_GIT_COMMIT_SHA}")

CONFIGURE_FILE(${CMAKE_CURRENT_SOURCE_DIR}/src/build_info.cpp.in
               ${CMAKE_CURRENT_SOURCE_DIR}/src/build_info.cpp)

SET(CMAKE_MODULE_PATH "${CMAKE_CURRENT_SOURCE_DIR}/cmake" ${CMAKE_MODULE_PATH})
SET(CMAKE_CXX_STANDARD 17)
SET(CMAKE_CXX_STANDARD_REQUIRED ON)
SET(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wall -Wpedantic -Wextra -DGIT_COMMIT_TAG")

IF (CLANG_TIDY_ENABLE)
    IF (NOT CMAKE_CXX_CLANG_TIDY)
        SET(CLANG_TIDY_EXECUTABLE "clang-tidy")
        SET(CLANG_TIDY_CHECKS "-checks=*")
        SET(CMAKE_CXX_CLANG_TIDY ${CLANG_TIDY_EXECUTABLE} ${CLANG_TIDY_CHECKS})
    ENDIF()
ELSE()
    UNSET(CMAKE_CXX_CLANG_TIDY)
ENDIF()

FIND_PACKAGE(OpenSSL 1.0.2 REQUIRED)
FIND_PACKAGE(Libevent REQUIRED)

ADD_SUBDIRECTORY(module/myproject-core)

if(MYPROJECT_CPP_BUILD_TESTS)
    ADD_SUBDIRECTORY(tests)
endif()

file(GLOB SOURCES
    src/*.*
    src/http-parser/*.*
)

#set(CMAKE_ARCHIVE_OUTPUT_DIRECTORY "${CMAKE_CURRENT_SOURCE_DIR}/lib")
add_library(${TARGET} ${SOURCES})

target_include_directories(${TARGET} PUBLIC include)
target_link_libraries(${TARGET}
    acvp-core
    ${OPENSSL_LIBRARIES}
    ${LIBEVENT_LIBRARIES}
    nghttp2
    )

module/myproject-core/CMakeLists.txt

cmake_minimum_required(VERSION 3.1)

set(TARGET myproject-core)
project(${TARGET})

SET(CMAKE_MODULE_PATH "${CMAKE_CURRENT_SOURCE_DIR}/cmake" ${CMAKE_MODULE_PATH})
option(MYPROJECT_CORE_BUILD_TESTS "Build MYPROJECT-CORE tests" OFF)
set(CMAKE_CXX_STANDARD 17)
set(CMAKE_CXX_STANDARD_REQUIRED ON)
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wall -Wpedantic -Wextra")

IF (CLANG_TIDY_ENABLE)
    IF (NOT CMAKE_CXX_CLANG_TIDY)
        SET(CLANG_TIDY_EXECUTABLE "clang-tidy")
        SET(CLANG_TIDY_CHECKS "-checks=*")
        SET(CMAKE_CXX_CLANG_TIDY ${CLANG_TIDY_EXECUTABLE} ${CLANG_TIDY_CHECKS})
    ENDIF()
ELSE()
    UNSET(CMAKE_CXX_CLANG_TIDY)
ENDIF()

find_package(CURL REQUIRED)
find_package(Libevent REQUIRED)

add_subdirectory(protocol)

INCLUDE_DIRECTORIES(
    ${CMAKE_CURRENT_SOURCE_DIR}/common
)

file(GLOB SOURCES
     ./payload/*.*
     ./http-header-utils/*.*
     ./libevent/*.*
     ./libevent/async-http-client/*.*
     ./http-packets/*.*
     ./http-packets/responses/*.*
     ./http-packets/requests/*.*
     ./http2-session/*.*
     ./streams/*.*
     ./streams/telemetry-processing-strategy/*.*
     ./streams/specification-registry/*.*
     ./ssl-utils/*.*
     ./http-request-utils/*.*
     ./signals/*.*
     ./common/*.*
     ./logger/*.*
     ./messages/*.*
     ./rmq/*.*
     ./compression/*.*
     ./message-brokers/*.*
     ./exception/*.*
     ./monitoring/*.*
     ./rate-limit/*.*
     ./sequence/*.*
     ./curl/*.*
     ./kafka/*.*
)

if(MYPROJECT_CORE_BUILD_TESTS)
    add_subdirectory(tests)
endif()

add_library(${TARGET} ${SOURCES})

set(TARGET_INCLUDE_DIRECTORIES
    ${CMAKE_CURRENT_SOURCE_DIR}
    ${CURL_INCLUDE_DIRS}
)
target_include_directories(${TARGET} PUBLIC ${TARGET_INCLUDE_DIRECTORIES})

set(TARGET_LINK_LIBRARIES
    protocol
    ${CURL_LIBRARIES}
    ${LIBEVENT_LIBRARIES}
    uuid
    z
)
target_link_libraries(${TARGET} ${TARGET_LINK_LIBRARIES})

add_definitions(-DZLIB_CONST)
Valentina Chumak
  • 279
  • 6
  • 17
  • 2
    You will probably have to show the CMakeLists.txt. Make sure the find_package() have REQUIRED – drescherjm Sep 09 '22 at 13:44
  • The error message is about creating `libacvp-core.dylib` library. In your code I see no line which creates that library. – Tsyvarev Sep 09 '22 at 14:39
  • it should be libmyproject-core, I've just tried to remove info about my company from published makefiles :facepalm – Valentina Chumak Sep 09 '22 at 14:49
  • Well, you create `myproject-core` library, but do link it with OpenSSL. (Only `myproject-cpp` target is linked with OpenSSL). This doesn't cause problems in case of static libraries, because their creation doesn't involve linking step. – Tsyvarev Sep 09 '22 at 16:02
  • Found that I need add libs to target_link_libraries, don't know how it work for Linux Changed cmake for submodule this way and it helped for me: ```FIND_PACKAGE(OpenSSL 1.0.2 REQUIRED) set(TARGET_LINK_LIBRARIES protocol ${CURL_LIBRARIES} ${LIBEVENT_LIBRARIES} log4cplus log4cplusU nghttp2 ${OPENSSL_LIBRARIES} uuid z ) target_link_libraries(${TARGET} ${TARGET_LINK_LIBRARIES}) ``` – Valentina Chumak Sep 09 '22 at 16:12

0 Answers0