5 / 5
Jan 29

Need some help linking a compiled static version of mongocxx to my c++ project in a wsl instance. The project is supposed to be a shared library that can be linked to other libs/exes.

I’m using the c version 1.23.4 and c++ version 3.7.1 of the drivers available from the releases page.
The parameters used to build them were the following:

c:
cmake . -DCMAKE_BUILD_TYPE=Release -DBUILD_VERSION=1.23.4 -DENABLE_MONGODB_AWS_AUTH=OFF -B./lib
cmake --build ./lib --config Release --parallel
cmake --install ./lib --prefix ./libInstall --config Release

c++:
cmake . -DCMAKE_BUILD_TYPE=Release -DBUILD_VERSION=3.7.1 -DCMAKE_PREFIX_PATH=…/mongo-c-driver-1.23.4 -B./lib -DBSONCXX_POLY_USE_BOOST=1 -DBoost_INCLUDE_DIR=/home/USER/boost/1_82_0 -DBUILD_SHARED_AND_STATIC_LIBS=ON
cmake --build ./lib --config Release --parallel
sudo cmake --build ./lib --target install

This generated my desired .a files to be used.

Now, onto my personal project, which is basically a simple create instance and list all documents.

I’ve tried linking the libs in my CMakeLists.txt as follows:

cmake_minimum_required(VERSION 3.22.1) project(TestMongo VERSION 1.0.0.1) include(GNUInstallDirs) set(CMAKE_CXX_STANDARD 17) set(CMAKE_CXX_STANDARD_REQUIRED True) set(CMAKE_WARN_DEPRECATED OFF) set(CMAKE_VERBOSE_MAKEFILE=ON) set(BSONCXX_STATIC_PATH ${CMAKE_SOURCE_DIR}/../mongo-cxx-driver-r3.7.1/lib/install/lib/libbsoncxx-static.a) set(MONGOCXX_STATIC_PATH ${CMAKE_SOURCE_DIR}/../mongo-cxx-driver-r3.7.1/lib/install/lib/libmongocxx-static.a) add_library(TestMongo SHARED main.cpp) target_link_libraries(TestMongo PUBLIC ${MONGOCXX_STATIC_PATH}) target_link_libraries(TestMongo PUBLIC ${BSONCXX_STATIC_PATH}) target_include_directories(TestMongo PRIVATE ${CMAKE_SOURCE_DIR}/../mongo-cxx-driver-r3.7.1/lib/install/include/bsoncxx/v_noabi) target_include_directories(TestMongo PRIVATE ${CMAKE_SOURCE_DIR}/../mongo-cxx-driver-r3.7.1/lib/install/include/mongocxx/v_noabi) target_include_directories(TestMongo PRIVATE ${CMAKE_SOURCE_DIR}/../boost/1_82_0) target_compile_options(TestMongo PUBLIC -fPIC -Wall -Wno-comment -Wunknown-pragmas -Wno-deprecated) install(TARGETS TestMongo) add_executable(TestMongoExe executable.cpp) target_include_directories(TestMongoExe PRIVATE ./) target_link_libraries(TestMongoExe PRIVATE TestMongo)

and also linking with:

add_library(MONGOCXX_STATIC STATIC IMPORTED) set_property(TARGET MONGOCXX_STATIC PROPERTY IMPORTED_LOCATION ${MONGOCXX_STATIC_PATH}) add_library(BSONCXX_STATIC STATIC IMPORTED) set_property(TARGET BSONCXX_STATIC PROPERTY IMPORTED_LOCATION ${BSONCXX_STATIC_PATH}) target_link_libraries(TestMongo PUBLIC BSONCXX_STATIC) target_link_libraries(TestMongo PUBLIC MONGOCXX_STATIC)

Both cases generate the following errors:
/usr/bin/ld: …/mongo-cxx-driver-r3.7.1/lib/install/lib/libmongocxx-static.a(uploader.cpp.o): warning: relocation against _ZN8mongocxx7v_noabi16gridfs_exceptionD1Ev' in read-only section .text.unlikely’
/usr/bin/ld: …/mongo-cxx-driver-r3.7.1/lib/install/lib/libbsoncxx-static.a(json.cpp.o): relocation R_X86_64_PC32 against symbol `_ZTVN7bsoncxx7v_noabi9exceptionE’ can not be used when making a shared object; recompile with -fPIC

Any ideas on how to fix this? Linking the shared objects worked fine but not the static ones. The suggestion to recompile with -fPIC doesn’t seem relevant in this case.

Thanks in advance!

@Danilo_Cavalcante It is not possible to build some artifacts with -fPIC and others without and then link them all together into the same binary or library. If you are building a shared library with -fPIC, then everything going into that library also needs to be built with -fPIC.

Also, why do you use target_link_libraries and target_include_directories rather than find_package?

23 days later

How would I build mongo/bson with -fPIC? Can I pass it as a parameter to the cmake?

Everything else is built with -fPIC.

About the find_package, I just couldn’t find the correct name to pass as an argument… passing “libmongocxx” just gave me a deprecated error. target_link and include also seemed more intuitive and less error prone.

@Danilo_Cavalcante I recommend that you look at the examples in the source distribution. In your specific case, examples/projects/mongocxx/cmake/static/ is probably the most useful. The CMakeLists.txt in that directory also shows examples for setting compiler flags.

10 months later

Following up on this issue, the examples were not helpful, but the issue was resolved with the parameter ~-DCMAKE_POSITION_INDEPENDENT_CODE=ON~ while compiling in cmake.