0

I'm building exe using boost libs, I want to static link the libs, but I have linker errors with the libboost_log lib.

I saw Question1 and Question2 but it didn't helped.

Cmake:

#### Boost
set(Boost_USE_STATIC_LIBS   ON)
set (Boost_USE_MULTITHREAD ON)  # enable multithreading
find_package (Boost REQUIRED COMPONENTS chrono filesystem regex system thread atomic date_time program_options log log_setup json)
if(Boost_FOUND)
    message("found boost. add includes")
    include_directories(${Boost_INCLUDE_DIRS})
    message("Boost Lib: "  ${Boost_LIBRARIES})
endif()
add_definitions(-DBOOST_ERROR_CODE_HEADER_ONLY)
add_definitions(-DBOOST_SYSTEM_NO_DEPRECATED)

### common libs
set (CommonLib ${Boost_LIBRARIES} ... )

### Rec
add_executable(Rec main.cpp)
target_sources(Rec PRIVATE
        ... )
target_link_libraries(Rec ${CommonLib} ...)

Linker log:

/usr/local/bin/c++  -g  -static-libgcc -static-libstdc++ CMakeFiles/Rec.dir/main.cpp.o CMakeFiles/Rec.dir/src/LogRotate.cpp.o CMakeFiles/Rec.dir/src/LogImages.cpp.o CMakeFiles/Rec.dir/__/shared/communicating/ModuleCommunicator.cpp.o CMakeFiles/Rec.dir/__/shared/communicating/Communicator.cpp.o CMakeFiles/Rec.dir/__/shared/health-checks/HealthReports.cpp.o CMakeFiles/Rec.dir/__/shared/gps/GpsData.cpp.o CMakeFiles/Rec.dir/__/shared/DetectionResults.cpp.o CMakeFiles/Rec.dir/__/shared/utils/utils.cpp.o  -o Rec   -L/usr/local/pylon/lib  -L/usr/local/pylon/include  -L/usr/local/pylon  -L/usr/local/cuda/lib64  -L/usr/local/cuda/targets/aarch64-linux/lib  -L/opt/yaml/include  -L/usr/include/yaml-cpp  -Wl,-rpath,/usr/local/pylon/lib:/usr/local/pylon/include:/usr/local/pylon:/usr/local/cuda/lib64:/usr/local/cuda/targets/aarch64-linux/lib:/opt/yaml/include:/usr/include/yaml-cpp:/usr/local/lib /usr/local/lib/libboost_chrono.a /usr/local/lib/libboost_filesystem.a /usr/local/lib/libboost_regex.a /usr/local/lib/libboost_system.a /usr/local/lib/libboost_thread.a /usr/local/lib/libboost_atomic.a /usr/local/lib/libboost_date_time.a /usr/local/lib/libboost_program_options.a /usr/local/lib/libboost_log.a /usr/local/lib/libboost_log_setup.a /usr/local/lib/libboost_json.a -lhiredis -lglog /usr/lib/aarch64-linux-gnu/librt.so /usr/local/lib/libboost_log.a /usr/local/lib/libboost_chrono.a /usr/local/lib/libboost_filesystem.a /usr/local/lib/libboost_regex.a /usr/local/lib/libboost_thread.a -lpthread /usr/local/lib/libboost_atomic.a -lrt /usr/local/lib/libboost_container.a -Wl,-rpath-link,/usr/local/lib

Linker error:

/usr/bin/ld: /usr/local/lib/libboost_log.a(default_sink.o): relocation R_AARCH64_ADR_PREL_PG_HI21 against symbol `stdout@@GLIBC_2.17' which may bind externally can not be used when making a shared object; recompile with -fPIC
/usr/bin/ld: /usr/local/lib/libboost_log.a(default_sink.o)(.text+0x514): unresolvable R_AARCH64_ADR_PREL_PG_HI21 relocation against symbol `stdout@@GLIBC_2.17'
/usr/bin/ld: final link failed: Bad value

It is solved by linking boost dynamically:

#### Boost
add_definitions( -DBOOST_ALL_NO_LIB )
add_definitions( -DBOOST_ALL_DYN_LINK )
set (Boost_USE_STATIC_LIBS OFF) # enable dynamic linking
set (Boost_USE_MULTITHREAD ON)  # enable multithreading
find_package (Boost REQUIRED COMPONENTS chrono filesystem regex system thread atomic date_time program_options log log_setup json)
if(Boost_FOUND)
    message("found boost. add includes")
    include_directories(${Boost_INCLUDE_DIRS})
    message("Boost Lib: "  ${Boost_LIBRARIES})
endif()
add_definitions(-DBOOST_ERROR_CODE_HEADER_ONLY)
add_definitions(-DBOOST_SYSTEM_NO_DEPRECATED)

But I need it to link statically.

I tried:

  • adding -static -> add_link_options("-static")
  • adding -lboost_log -> target_link_libraries(Rec ${CommonLib} ... -lboost_log)

but it didn't help.

I have a and so lib in my lib dir:

root@my# find /usr/local/lib/ -name libboost_log.*
/usr/local/lib/libboost_log.so.1.78.0
/usr/local/lib/libboost_log.a
/usr/local/lib/libboost_log.so

How can I link libboost_log static to my exe?

lior.i
  • 573
  • 1
  • 7
  • 20

0 Answers0