|
| 1 | +ifndef::include-only-once[] |
| 2 | +:root-path: ../ |
| 3 | +include::{root-path}_config.adoc[] |
| 4 | +endif::[] |
| 5 | +[#top-installing-osi-prerequisits] |
| 6 | += Installing protobuf for static / dynamic linking |
| 7 | + |
| 8 | +== Prerequisites |
| 9 | + |
| 10 | +* You have installed _cmake_ (version 3.10.2 or higher) |
| 11 | +* You must have superuser privileges |
| 12 | + |
| 13 | +Static linking is the recommended way to package OSI FMUs for sharing with others to be integrated in a co-simulation: They should have minimal external dependencies in order to ensure maximum portability. |
| 14 | +For other use cases like first trials to get started with OSI, dynamic linking could be an option as well. |
| 15 | + |
| 16 | +== Windows |
| 17 | + |
| 18 | +Dynamic Linking (NOT RECOMMENDED):: |
| 19 | + |
| 20 | +Since on Windows symbols are not exported per default, it can be kind of annoying to deal with this during _protobuf_ header generation (see for example https://groups.google.com/g/protobuf/c/PDR1bqRazts). |
| 21 | +That is an important reason to use static linking. |
| 22 | + |
| 23 | +Static Linking:: |
| 24 | + |
| 25 | +Static linking might require to manually build _protobuf_. |
| 26 | +It is important to notice that on Windows you can also specify how to link against the C runtime. |
| 27 | +Basically, this can be set in CMake, e.g. https://cmake.org/cmake/help/latest/prop_tgt/MSVC_RUNTIME_LIBRARY.html |
| 28 | + |
| 29 | +Therefore, it could make sense to still dynamically link against the C Runtime when statically linking _protobuf_ / OSI. |
| 30 | +(This is important e.g. when building shared libraries, since a static C runtime will create an isolated heap for your dll, which can lead to segfaults depending on what you expose on your public interfaces.) |
| 31 | + |
| 32 | +The easiest way to achieve static linking on Windows without setting all the stuff manually in Cmake and building _protobuf_ is to actually **install static _protobuf_ with dynamic c-runtime with vcpkg**: |
| 33 | + |
| 34 | +---- |
| 35 | +vcpkg install --triplet=x64-windows-static-md protobuf |
| 36 | +---- |
| 37 | + |
| 38 | +Build:: |
| 39 | + |
| 40 | +For the cmake configuration, we can directly specify our vcpkg installation: |
| 41 | +---- |
| 42 | +cmake .. -DVCPKG_TARGET_TRIPLET=x64-windows-static-md -DCMAKE_TOOLCHAIN_FILE=C:/path/to/vcpkg/scripts/buildsystems/vcpkg.cmake -A x64 |
| 43 | +cmake --build . --config Release |
| 44 | +---- |
| 45 | + |
| 46 | +== Linux |
| 47 | + |
| 48 | +Dynamic linking (NOT RECOMMENDED):: |
| 49 | + |
| 50 | +As already mentioned, shared linking is possible on Linux, but NOT RECOMMENDED. |
| 51 | +However, for dynamic linking install _protobuf_ (version 3.0.0 or higher) with apt: |
| 52 | +---- |
| 53 | +sudo apt-get install libprotobuf-dev protobuf-compiler |
| 54 | +---- |
| 55 | +In the CMakeLists of the OSI project, `LINK_WITH_SHARED_OSI` has to be enabled. |
| 56 | + |
| 57 | +Static linking:: |
| 58 | + |
| 59 | +A common error here is to just install _protobuf_ with apt and link against it. |
| 60 | +This means that your OSI is build statically but still linking dynamically against _protobuf_. |
| 61 | +Here, again either _protobuf_ has to build statically from source or some solution e.g. vcpkg needs to be utilized. |
| 62 | +We recommend the following (as in the README of the OSI project): |
| 63 | + |
| 64 | +Install _protobuf_ (version 3.0.0 or higher) from source with `CXXFLAGS="-fPIC"` to allow static linking of your OSI FMUs (replace <version> with preferred release): |
| 65 | +---- |
| 66 | +wget https://github.com/protocolbuffers/protobuf/releases/download/<version>/protobuf-all-<version>.tar.gz |
| 67 | +tar -xzf protobuf-all-<version>.tar.gz |
| 68 | +cd protobuf-<version>/ |
| 69 | +./configure --disable-shared CXXFLAGS="-fPIC" |
| 70 | +make |
| 71 | +sudo make install |
| 72 | +sudo ldconfig |
| 73 | +---- |
0 commit comments