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?